Lightningbeam/daw-backend/examples/midi_debug.rs

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!");
}
}