Play both higher and lower notes

master
D4VID 3 months ago
parent 46c0e16338
commit 7701828f9b

@ -3,6 +3,8 @@ use std::{fs, io::{stdout, Write}};
use midly::Smf; use midly::Smf;
const FILENAME: &str = "media/TOUHOU - Bad Apple!!.mid"; const FILENAME: &str = "media/TOUHOU - Bad Apple!!.mid";
const STEP: u32 = 96;
const TRACK: usize = 0;
fn get_u32(bits: &[bool; 32]) -> u32 { fn get_u32(bits: &[bool; 32]) -> u32 {
let mut result = 0u32; let mut result = 0u32;
@ -20,33 +22,47 @@ fn main() {
let mut stdout = stdout(); 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() { for (_, event) in track.iter().enumerate() {
// println!("{}", event.delta);
let mut delta = event.delta.as_int(); let mut delta = event.delta.as_int();
while delta >= 96 { while delta >= STEP {
delta -= 96; delta -= STEP;
let word = get_u32(&current_on); let upper_word = get_u32(&current_on_upper);
stdout.write(&word.to_le_bytes()).ok(); let lower_word = get_u32(&current_on_lower);
stdout.write(&upper_word.to_le_bytes()).ok();
stdout.write(&lower_word.to_le_bytes()).ok();
} }
match event.kind { match event.kind {
midly::TrackEventKind::Midi { channel: _, message } => match message { midly::TrackEventKind::Midi { channel: _, message } => match message {
midly::MidiMessage::NoteOff { key, vel: _ } => { midly::MidiMessage::NoteOff { key, vel: _ } => {
let index = key.as_int() as isize - 59; let key_i = key.as_int() as usize;
if index >= 0 && index < 32 { if key_i >= 59 && key_i <= 90 {
current_on[index as usize] = false; 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: _ } => { midly::MidiMessage::NoteOn { key, vel: _ } => {
let index = key.as_int() as isize - 59; let key_i = key.as_int() as usize;
if index >= 0 && index < 32 { if key_i >= 59 && key_i <= 90 {
current_on[index as usize] = true; 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);
}
} }
} }
} }

Loading…
Cancel
Save