75 lines
2.6 KiB
Rust
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.");
|
|
}
|
|
}
|