73 lines
2.5 KiB
Rust
73 lines
2.5 KiB
Rust
use daw_backend::load_midi_file;
|
|
|
|
fn main() {
|
|
let clip = load_midi_file("darude-sandstorm.mid", 0, 44100).unwrap();
|
|
|
|
println!("Clip duration: {:.2}s", clip.duration);
|
|
println!("Total events: {}", clip.events.len());
|
|
println!("\nEvent summary:");
|
|
|
|
let mut note_on_count = 0;
|
|
let mut note_off_count = 0;
|
|
let mut other_count = 0;
|
|
|
|
for event in &clip.events {
|
|
if event.is_note_on() {
|
|
note_on_count += 1;
|
|
} else if event.is_note_off() {
|
|
note_off_count += 1;
|
|
} else {
|
|
other_count += 1;
|
|
}
|
|
}
|
|
|
|
println!(" Note On events: {}", note_on_count);
|
|
println!(" Note Off events: {}", note_off_count);
|
|
println!(" Other events: {}", other_count);
|
|
|
|
// Show events around 28 seconds
|
|
println!("\nEvents around 28 seconds (27-29s):");
|
|
let sample_rate = 44100.0;
|
|
let start_sample = (27.0 * sample_rate) as u64;
|
|
let end_sample = (29.0 * sample_rate) as u64;
|
|
|
|
for (i, event) in clip.events.iter().enumerate() {
|
|
if event.timestamp >= start_sample && event.timestamp <= end_sample {
|
|
let time_sec = event.timestamp as f64 / sample_rate;
|
|
let event_type = if event.is_note_on() {
|
|
"NoteOn"
|
|
} else if event.is_note_off() {
|
|
"NoteOff"
|
|
} else {
|
|
"Other"
|
|
};
|
|
println!(" [{:4}] {:.3}s: {} ch={} note={} vel={}",
|
|
i, time_sec, event_type, event.channel(), event.data1, event.data2);
|
|
}
|
|
}
|
|
|
|
// Check for stuck notes - note ons without corresponding note offs
|
|
println!("\nChecking for unmatched notes...");
|
|
let mut active_notes = std::collections::HashMap::new();
|
|
|
|
for (i, event) in clip.events.iter().enumerate() {
|
|
if event.is_note_on() {
|
|
let key = (event.channel(), event.data1);
|
|
active_notes.insert(key, i);
|
|
} else if event.is_note_off() {
|
|
let key = (event.channel(), event.data1);
|
|
active_notes.remove(&key);
|
|
}
|
|
}
|
|
|
|
if !active_notes.is_empty() {
|
|
println!("Found {} notes that never got note-off events:", active_notes.len());
|
|
for ((ch, note), event_idx) in active_notes.iter().take(10) {
|
|
let time_sec = clip.events[*event_idx].timestamp as f64 / sample_rate;
|
|
println!(" Note {} on channel {} at {:.2}s (event #{})", note, ch, time_sec, event_idx);
|
|
}
|
|
} else {
|
|
println!("All notes have matching note-off events!");
|
|
}
|
|
}
|