module Music module Performance class MidiUtil QUARTER = Rational(1,4) def self.delta duration, ppqn pulses = (duration / QUARTER) * ppqn return pulses.round end def self.usec_per_qnote notes_per_sec spn = 1.0 / notes_per_sec spqn = spn / 4.0 return (spqn * 1_000_000).to_i end p0 = Music::Transcription::Pitch.new(octave:-1,semitone:0) MIDI_NOTENUMS = Hash[ (0..127).map do |note_num| [ p0.transpose(note_num), note_num ] end ] def self.pitch_to_notenum pitch MIDI_NOTENUMS[pitch.round] end def self.dynamic_to_volume dynamic (dynamic * 127).round end def self.note_velocity(accented) accented ? 112 : 70 end end end end