commit
3c8256faf7
@ -0,0 +1 @@
|
||||
/target
|
@ -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",
|
||||
]
|
@ -0,0 +1,7 @@
|
||||
[package]
|
||||
name = "bad-apple"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
midly = "0.5.3"
|
Binary file not shown.
@ -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());
|
||||
// }
|
||||
}
|
Loading…
Reference in new issue