use crate::MidiMessage;
pub trait MidiOut {
type Error: core::fmt::Display;
fn send_message(&mut self, message: MidiMessage) -> Result<(), Self::Error> {
match message {
MidiMessage::NoteOff { channel, note } => {
self.send_note_off(channel, note.midi_value())
}
MidiMessage::NoteOn { channel, note } => {
self.send_note_on(channel, note.midi_value(), note.vel)
}
MidiMessage::CC {
channel,
controller,
value,
} => self.send_cc(channel, controller, value),
MidiMessage::PC { channel, value } => self.send_pc(channel, value),
MidiMessage::PitchBend { channel, value } => self.send_pitch_bend(channel, value),
MidiMessage::Clock => self.send_clock(),
MidiMessage::Start => self.send_start(),
MidiMessage::Continue => self.send_continue(),
MidiMessage::Stop => self.send_stop(),
}
}
fn send_start(&mut self) -> Result<(), Self::Error>;
fn send_continue(&mut self) -> Result<(), Self::Error>;
fn send_stop(&mut self) -> Result<(), Self::Error>;
fn send_clock(&mut self) -> Result<(), Self::Error>;
fn send_note_on(&mut self, channel_id: u8, note: u8, velocity: u8) -> Result<(), Self::Error>;
fn send_note_off(&mut self, channel_id: u8, note: u8) -> Result<(), Self::Error>;
fn send_cc(&mut self, channel_id: u8, parameter: u8, value: u8) -> Result<(), Self::Error>;
fn send_pc(&mut self, channel_id: u8, value: u8) -> Result<(), Self::Error>;
fn send_pitch_bend(&mut self, channel_id: u8, value: u16) -> Result<(), Self::Error>;
}