use crate::midi_observer::{MidiEvent, MidiObserver};
#[derive(Default)]
pub struct DebugMidiObserver {
pub truncate_sysex: bool,
}
impl DebugMidiObserver {
pub fn new() -> Self {
Self::default()
}
pub fn with_truncate_sysex(mut self, on: bool) -> Self {
self.truncate_sysex = on;
self
}
}
impl MidiObserver for DebugMidiObserver {
fn on_midi_event(&mut self, event: &MidiEvent, source_channel: usize) {
match event {
MidiEvent::NoteOff {
channel,
note,
velocity,
} => println!(
"ch{:02} NoteOff midi_ch={} note={} vel={}",
source_channel, channel, note, velocity
),
MidiEvent::NoteOn {
channel,
note,
velocity,
} => println!(
"ch{:02} NoteOn midi_ch={} note={} vel={}",
source_channel, channel, note, velocity
),
MidiEvent::PolyAftertouch {
channel,
note,
pressure,
} => println!(
"ch{:02} PolyAfterTouch midi_ch={} note={} pressure={}",
source_channel, channel, note, pressure
),
MidiEvent::ControlChange {
channel,
controller,
value,
} => println!(
"ch{:02} ControlChange midi_ch={} cc={} val={}",
source_channel, channel, controller, value
),
MidiEvent::ProgramChange { channel, program } => println!(
"ch{:02} ProgramChange midi_ch={} program={}",
source_channel, channel, program
),
MidiEvent::ChannelAftertouch { channel, pressure } => println!(
"ch{:02} ChAfterTouch midi_ch={} pressure={}",
source_channel, channel, pressure
),
MidiEvent::PitchBend { channel, value } => println!(
"ch{:02} PitchBend midi_ch={} value={} (centre=8192)",
source_channel, channel, value
),
MidiEvent::SysEx(data) => {
if self.truncate_sysex && data.len() > 8 {
let head: alloc::vec::Vec<_> =
data.iter().take(8).map(|b| format!("{:02X}", b)).collect();
println!(
"ch{:02} SysEx len={} data=[{}, ...]",
source_channel,
data.len(),
head.join(", ")
);
} else {
let hex: alloc::vec::Vec<_> =
data.iter().map(|b| format!("{:02X}", b)).collect();
println!(
"ch{:02} SysEx len={} data=[{}]",
source_channel,
data.len(),
hex.join(", ")
);
}
}
MidiEvent::Raw(bytes) => {
let hex: alloc::vec::Vec<_> = bytes.iter().map(|b| format!("{:02X}", b)).collect();
println!(
"ch{:02} Raw len={} data=[{}]",
source_channel,
bytes.len(),
hex.join(", ")
);
}
}
}
}