Lightningbeam/daw-backend/examples/midi_end_debug.rs

75 lines
2.6 KiB
Rust

use daw_backend::load_midi_file;
fn main() {
let clip = load_midi_file("darude-sandstorm.mid", 0, 44100).unwrap();
println!("Clip duration: {:.3}s", clip.duration);
println!("Total events: {}", clip.events.len());
// Show the last 30 events
println!("\nLast 30 events:");
let sample_rate = 44100.0;
let start_idx = clip.events.len().saturating_sub(30);
for (i, event) in clip.events.iter().enumerate().skip(start_idx) {
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={:3} vel={:3}",
i, time_sec, event_type, event.channel(), event.data1, event.data2);
}
// Find notes that are still active at the end of the clip
println!("\nNotes active at end of clip ({:.3}s):", clip.duration);
let mut active_notes = std::collections::HashMap::new();
for event in &clip.events {
let time_sec = event.timestamp as f64 / sample_rate;
if event.is_note_on() {
let key = (event.channel(), event.data1);
active_notes.insert(key, time_sec);
} else if event.is_note_off() {
let key = (event.channel(), event.data1);
active_notes.remove(&key);
}
}
if !active_notes.is_empty() {
println!("Found {} notes still active after all events:", active_notes.len());
for ((ch, note), start_time) in &active_notes {
println!(" Channel {} Note {} started at {:.3}s (no note-off before clip end)",
ch, note, start_time);
}
} else {
println!("All notes are turned off by the end!");
}
// Check maximum polyphony
println!("\nAnalyzing polyphony...");
let mut max_polyphony = 0;
let mut current_notes = std::collections::HashSet::new();
for event in &clip.events {
if event.is_note_on() {
let key = (event.channel(), event.data1);
current_notes.insert(key);
max_polyphony = max_polyphony.max(current_notes.len());
} else if event.is_note_off() {
let key = (event.channel(), event.data1);
current_notes.remove(&key);
}
}
println!("Maximum simultaneous notes: {}", max_polyphony);
println!("Available synth voices: 16");
if max_polyphony > 16 {
println!("WARNING: Polyphony exceeds available voices! Voice stealing will occur.");
}
}