diff --git a/src/main.rs b/src/main.rs index 8e3553f..03704d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,8 @@ use std::{fs, io::{stdout, Write}}; use midly::Smf; const FILENAME: &str = "media/TOUHOU - Bad Apple!!.mid"; +const STEP: u32 = 96; +const TRACK: usize = 0; fn get_u32(bits: &[bool; 32]) -> u32 { let mut result = 0u32; @@ -20,33 +22,47 @@ fn main() { let mut stdout = stdout(); - let mut current_on = [false; 32]; + let mut current_on_upper = [false; 32]; // higher notes + let mut current_on_lower = [false; 32]; // lower notes - let track = &smf.tracks[0]; + let track = &smf.tracks[TRACK]; for (_, event) in track.iter().enumerate() { + // println!("{}", event.delta); let mut delta = event.delta.as_int(); - while delta >= 96 { - delta -= 96; - let word = get_u32(¤t_on); - stdout.write(&word.to_le_bytes()).ok(); + while delta >= STEP { + delta -= STEP; + let upper_word = get_u32(¤t_on_upper); + let lower_word = get_u32(¤t_on_lower); + stdout.write(&upper_word.to_le_bytes()).ok(); + stdout.write(&lower_word.to_le_bytes()).ok(); } match event.kind { midly::TrackEventKind::Midi { channel: _, message } => match message { midly::MidiMessage::NoteOff { key, vel: _ } => { - let index = key.as_int() as isize - 59; - if index >= 0 && index < 32 { - current_on[index as usize] = false; + let key_i = key.as_int() as usize; + if key_i >= 59 && key_i <= 90 { + current_on_upper[key_i-59] = false; + } + if key_i >= 27 && key_i <= 58 { + current_on_lower[key_i-27] = false; } } midly::MidiMessage::NoteOn { key, vel: _ } => { - let index = key.as_int() as isize - 59; - if index >= 0 && index < 32 { - current_on[index as usize] = true; + let key_i = key.as_int() as usize; + if key_i >= 59 && key_i <= 90 { + current_on_upper[key_i-59] = true; + } + if key_i >= 27 && key_i <= 58 { + current_on_lower[key_i-27] = true; } } - _ => {} + _ => { + // println!("event {}: {:?}", i, message); + } }, - _ => {} + _ => { + // println!("event {}: {:?}", i, event); + } } } }