|
|
|
@ -2,8 +2,14 @@ use std::{fs, io::{stdout, Write}};
|
|
|
|
|
|
|
|
|
|
use midly::Smf;
|
|
|
|
|
|
|
|
|
|
const FILENAME: &str = "media/TOUHOU - Bad Apple!!.mid";
|
|
|
|
|
const STEP: u32 = 96;
|
|
|
|
|
// const FILENAME: &str = "media/TOUHOU - Bad Apple!!.mid";
|
|
|
|
|
// const STEP: u32 = 96;
|
|
|
|
|
// const HIGHEST_NOST: u32 = 90;
|
|
|
|
|
// const TRACK: usize = 0;
|
|
|
|
|
|
|
|
|
|
const FILENAME: &str = "media/bad_apple.mid";
|
|
|
|
|
const STEP: u32 = 32;
|
|
|
|
|
const HIGHEST_NOTE: usize = 84;
|
|
|
|
|
const TRACK: usize = 0;
|
|
|
|
|
|
|
|
|
|
fn get_u32(bits: &[bool; 32]) -> u32 {
|
|
|
|
@ -25,9 +31,14 @@ fn main() {
|
|
|
|
|
let mut current_on_upper = [false; 32]; // higher notes
|
|
|
|
|
let mut current_on_lower = [false; 32]; // lower notes
|
|
|
|
|
|
|
|
|
|
let highest_upper_note = HIGHEST_NOTE;
|
|
|
|
|
let lowest_upper_note = HIGHEST_NOTE - 31;
|
|
|
|
|
let highest_lower_note = HIGHEST_NOTE - 32;
|
|
|
|
|
let lowest_lower_note = HIGHEST_NOTE - 63;
|
|
|
|
|
|
|
|
|
|
let track = &smf.tracks[TRACK];
|
|
|
|
|
for (_, event) in track.iter().enumerate() {
|
|
|
|
|
// println!("{}", event.delta);
|
|
|
|
|
eprintln!("delta: {}", event.delta);
|
|
|
|
|
let mut delta = event.delta.as_int();
|
|
|
|
|
while delta >= STEP {
|
|
|
|
|
delta -= STEP;
|
|
|
|
@ -40,28 +51,29 @@ fn main() {
|
|
|
|
|
midly::TrackEventKind::Midi { channel: _, message } => match message {
|
|
|
|
|
midly::MidiMessage::NoteOff { key, vel: _ } => {
|
|
|
|
|
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 >= lowest_upper_note && key_i <= highest_upper_note {
|
|
|
|
|
current_on_upper[key_i - lowest_upper_note] = false;
|
|
|
|
|
}
|
|
|
|
|
if key_i >= 27 && key_i <= 58 {
|
|
|
|
|
current_on_lower[key_i-27] = false;
|
|
|
|
|
if key_i >= lowest_lower_note && key_i <= highest_lower_note {
|
|
|
|
|
current_on_lower[key_i - lowest_lower_note] = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
midly::MidiMessage::NoteOn { key, vel: _ } => {
|
|
|
|
|
let key_i = key.as_int() as usize;
|
|
|
|
|
if key_i >= 59 && key_i <= 90 {
|
|
|
|
|
current_on_upper[key_i-59] = true;
|
|
|
|
|
eprintln!("key: {}", key_i);
|
|
|
|
|
if key_i >= lowest_upper_note && key_i <= highest_upper_note {
|
|
|
|
|
current_on_upper[key_i - lowest_upper_note] = true;
|
|
|
|
|
}
|
|
|
|
|
if key_i >= 27 && key_i <= 58 {
|
|
|
|
|
current_on_lower[key_i-27] = true;
|
|
|
|
|
if key_i >= lowest_lower_note && key_i <= highest_lower_note {
|
|
|
|
|
current_on_lower[key_i - lowest_lower_note] = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_ => {
|
|
|
|
|
// println!("event {}: {:?}", i, message);
|
|
|
|
|
// eprintln!("event {}: {:?}", i, message);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
_ => {
|
|
|
|
|
// println!("event {}: {:?}", i, event);
|
|
|
|
|
// eprintln!("event {}: {:?}", i, event);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|