commit 3c8256faf77840ca0e7a6228886921141f38d7f6 Author: D4VID Date: Fri Jun 20 14:52:16 2025 +0200 Convert midi to words diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..44f693f --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,70 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bad-apple" +version = "0.1.0" +dependencies = [ + "midly", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "midly" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "207d755f4cb882d20c4da58d707ca9130a0c9bc5061f657a4f299b8e36362b7a" +dependencies = [ + "rayon", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..70283b8 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "bad-apple" +version = "0.1.0" +edition = "2021" + +[dependencies] +midly = "0.5.3" diff --git a/media/TOUHOU - Bad Apple!!.mid b/media/TOUHOU - Bad Apple!!.mid new file mode 100644 index 0000000..6c8ddc9 Binary files /dev/null and b/media/TOUHOU - Bad Apple!!.mid differ diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..285a7db --- /dev/null +++ b/src/main.rs @@ -0,0 +1,60 @@ +use std::fs; + +use midly::Smf; + +const FILENAME: &str = "media/TOUHOU - Bad Apple!!.mid"; + +fn get_u32(bits: &[bool; 32]) -> u32 { + let mut result = 0u32; + for (i, &bit) in bits.iter().enumerate() { + if bit { + result |= 1 << (31 - i); + } + } + return result; +} + +fn main() { + let bytes = fs::read(FILENAME).expect("Failed to read input file!"); + let smf = Smf::parse(&bytes).unwrap(); + + let mut current_on = [false; 32]; + + let track = &smf.tracks[0]; + print!("const DATA: &[u32] = &["); + 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); + print!("0x{:x},", word); + } + 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; + } + } + midly::MidiMessage::NoteOn { key, vel: _ } => { + let index = key.as_int() as isize - 59; + if index >= 0 && index < 32 { + current_on[index as usize] = true; + } + } + _ => { + // println!("event {}: {:?}", i, message); + } + }, + _ => { + // println!("event {}: {:?}", i, event); + } + } + } + println!("];"); + // for (i, track) in smf.tracks.iter().enumerate() { + // println!("track {} has {} events", i, track.len()); + // } +}