pub mod consts;
pub mod message;
pub mod note;
pub mod sysex;
#[cfg(feature = "transport")]
pub mod transport;
pub mod vendor;
pub use crate::message::{Channel, ControlEvent, KeyEvent, MidiMessage, SysExEvent};
pub use crate::note::MidiNote;
#[cfg(feature = "transport")]
pub use crate::transport::MidiMessageSend;
pub fn note_on(channel: Channel, note: MidiNote, velocity: u8) -> MidiMessage {
MidiMessage::NoteOn(
channel,
KeyEvent {
key: note,
value: velocity,
},
)
}
pub fn note_off(channel: Channel, note: MidiNote, velocity: u8) -> MidiMessage {
MidiMessage::NoteOff(
channel,
KeyEvent {
key: note,
value: velocity,
},
)
}
pub fn poly_key_pressure(channel: Channel, note: MidiNote, pressure: u8) -> MidiMessage {
MidiMessage::PolyKeyPressure(
channel,
KeyEvent {
key: note,
value: pressure,
},
)
}
pub fn control_change(channel: Channel, control: u8, value: u8) -> MidiMessage {
MidiMessage::ControlChange(channel, ControlEvent { control, value })
}
pub fn program_change(channel: Channel, program: u8) -> MidiMessage {
MidiMessage::ProgramChange(channel, program)
}
pub fn channel_pressure(channel: Channel, pressure: u8) -> MidiMessage {
MidiMessage::ProgramChange(channel, pressure)
}
pub fn pitch_bend(channel: Channel, change: u16) -> MidiMessage {
if change > 0x3fff {
return MidiMessage::Invalid;
}
let lsb: u8 = (change & 0b0111_1111) as u8;
let msb: u8 = ((change >> 7) & 0b0111_1111) as u8;
MidiMessage::PitchBend(channel, lsb, msb)
}
pub fn non_rt_usysex(device: u8, subid: [u8; 2], data: &[u8]) -> MidiMessage {
MidiMessage::SysEx(SysExEvent::new_non_realtime(device, subid, data))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
pub fn test_simple_api() {
let msg = MidiMessage::NoteOn(Channel::Ch1, KeyEvent { key: 59, value: 88 });
assert_eq!(note_on(Channel::Ch1, 59, 88), msg);
let msg = MidiMessage::NoteOff(Channel::Ch1, KeyEvent { key: 60, value: 0 });
assert_eq!(note_off(Channel::Ch1, 60, 0), msg);
let msg = MidiMessage::ControlChange(
Channel::Ch1,
ControlEvent {
control: 114,
value: 65,
},
);
assert_eq!(control_change(Channel::Ch1, 114, 65), msg);
let msg = MidiMessage::PitchBend(Channel::Ch1, 0, 76);
assert_eq!(pitch_bend(Channel::Ch1, 0x2600), msg);
assert_eq!(pitch_bend(Channel::Ch1, 0x8000), MidiMessage::Invalid);
let msg = MidiMessage::SysEx(SysExEvent::new_non_realtime(
consts::usysex::ALL_CALL,
[0x06, 0x01],
&[0xf7],
));
assert_eq!(
non_rt_usysex(consts::usysex::ALL_CALL, [0x06, 0x01], &[0xf7]),
msg
);
}
}