use super::{utils::RangeCheck, OxiError};
pub type U7 = u8;
pub type U14 = u16;
pub enum MidiEvent {
NoteOn {
channel: u8,
key: U7,
vel: U7,
},
NoteOff {
channel: u8,
key: U7,
},
ControlChange {
channel: u8,
ctrl: U7,
value: U7,
},
AllNotesOff {
channel: u8,
},
AllSoundOff {
channel: u8,
},
PitchBend {
channel: u8,
value: U14,
},
ProgramChange {
channel: u8,
program_id: U7,
},
ChannelPressure {
channel: u8,
value: U7,
},
PolyphonicKeyPressure {
channel: u8,
key: U7,
value: U7,
},
SystemReset,
}
impl MidiEvent {
pub fn check(self) -> Result<Self, OxiError> {
match &self {
MidiEvent::NoteOn { key, vel, .. } => {
RangeCheck::check(0..=127, &key, OxiError::KeyOutOfRange)?;
RangeCheck::check(0..=127, &vel, OxiError::VelocityOutOfRange)?;
}
MidiEvent::NoteOff { key, .. } => {
RangeCheck::check(0..=127, &key, OxiError::KeyOutOfRange)?;
}
MidiEvent::ControlChange { ctrl, value, .. } => {
RangeCheck::check(0..=127, &ctrl, OxiError::CtrlOutOfRange)?;
RangeCheck::check(0..=127, &value, OxiError::CCValueOutOfRange)?;
}
MidiEvent::AllNotesOff { .. } => {}
MidiEvent::AllSoundOff { .. } => {}
MidiEvent::PitchBend { value, .. } => {
RangeCheck::check(0..=16383, &value, OxiError::PithBendOutOfRange)?;
}
MidiEvent::ProgramChange { program_id, .. } => {
RangeCheck::check(0..=127, &program_id, OxiError::ProgramOutOfRange)?;
}
MidiEvent::ChannelPressure { value, .. } => {
RangeCheck::check(0..=127, &value, OxiError::ChannelPressureOutOfRange)?;
}
MidiEvent::PolyphonicKeyPressure { key, value, .. } => {
RangeCheck::check(0..=127, &key, OxiError::KeyOutOfRange)?;
RangeCheck::check(0..=127, &value, OxiError::KeyPressureOutOfRange)?;
}
MidiEvent::SystemReset => {}
};
Ok(self)
}
}