mirror of
https://github.com/italicsjenga/usbd-midi.git
synced 2024-12-23 12:21:30 +11:00
Add tests for message decoding
This commit is contained in:
parent
0223763ed0
commit
3d3ff68299
|
@ -3,7 +3,7 @@ use core::convert::TryFrom;
|
||||||
/// The Channel is a value ranging from 0x0 to 0xF
|
/// The Channel is a value ranging from 0x0 to 0xF
|
||||||
/// This is a standard midi concept
|
/// This is a standard midi concept
|
||||||
/// Note Channel1 = 0 on the wire
|
/// Note Channel1 = 0 on the wire
|
||||||
#[derive(Debug,Copy,Clone)]
|
#[derive(Debug,Copy,Clone, Eq, PartialEq)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum Channel {
|
pub enum Channel {
|
||||||
Channel1 = 0x0, Channel2 = 0x1, Channel3 = 0x2, Channel4 = 0x3,
|
Channel1 = 0x0, Channel2 = 0x1, Channel3 = 0x2, Channel4 = 0x3,
|
||||||
|
|
|
@ -14,7 +14,7 @@ type Velocity = U7;
|
||||||
/// Note: not current exhaustive and SysEx messages end up
|
/// Note: not current exhaustive and SysEx messages end up
|
||||||
/// being a confusing case. So are currently note implemented
|
/// being a confusing case. So are currently note implemented
|
||||||
/// they are sort-of unbounded
|
/// they are sort-of unbounded
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Eq, PartialEq)]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
NoteOff(Channel,Note,Velocity),
|
NoteOff(Channel,Note,Velocity),
|
||||||
NoteOn(Channel,Note,Velocity),
|
NoteOn(Channel,Note,Velocity),
|
||||||
|
|
|
@ -5,7 +5,7 @@ use num_enum::TryFromPrimitive;
|
||||||
/// note the flat versions are associated constants
|
/// note the flat versions are associated constants
|
||||||
/// but can be referenced like Note::Bb3
|
/// but can be referenced like Note::Bb3
|
||||||
/// C1m is the C-1
|
/// C1m is the C-1
|
||||||
#[derive(Debug,Copy,Clone,TryFromPrimitive)]
|
#[derive(Debug,Copy,Clone,TryFromPrimitive,Eq,PartialEq)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum Note {
|
pub enum Note {
|
||||||
C1m, Cs1m, D1m, Ds1m, E1m, F1m, Fs1m, G1m, Gs1m, A1m, As1m, B1m,
|
C1m, Cs1m, D1m, Ds1m, E1m, F1m, Fs1m, G1m, Gs1m, A1m, As1m, B1m,
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::data::byte::u4::U4;
|
||||||
/// The Cable Number (CN) is a value ranging from 0x0 to 0xF
|
/// The Cable Number (CN) is a value ranging from 0x0 to 0xF
|
||||||
/// indicating the number assignment of the Embedded MIDI Jack associated
|
/// indicating the number assignment of the Embedded MIDI Jack associated
|
||||||
/// with the endpoint that is transferring the data
|
/// with the endpoint that is transferring the data
|
||||||
#[derive(Debug,Clone,Copy)]
|
#[derive(Debug,Clone,Copy,Eq, PartialEq)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum CableNumber {
|
pub enum CableNumber {
|
||||||
Cable0 = 0x0, Cable1 = 0x1, Cable2 = 0x2, Cable3 = 0x3,
|
Cable0 = 0x0, Cable1 = 0x1, Cable2 = 0x2, Cable3 = 0x3,
|
||||||
|
|
|
@ -9,7 +9,7 @@ use core::convert::TryFrom;
|
||||||
/// A packet that communicates with the host
|
/// A packet that communicates with the host
|
||||||
/// Currently supported is sending the specified normal midi
|
/// Currently supported is sending the specified normal midi
|
||||||
/// message over the supplied cable number
|
/// message over the supplied cable number
|
||||||
#[derive(Debug)]
|
#[derive(Debug,Eq, PartialEq)]
|
||||||
pub struct UsbMidiEventPacket {
|
pub struct UsbMidiEventPacket {
|
||||||
pub cable_number : CableNumber,
|
pub cable_number : CableNumber,
|
||||||
pub message: Message
|
pub message: Message
|
||||||
|
@ -84,4 +84,60 @@ impl UsbMidiEventPacket{
|
||||||
message : midi
|
message : midi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use core::convert::TryFrom;
|
||||||
|
use crate::data::usb_midi::usb_midi_event_packet::UsbMidiEventPacket;
|
||||||
|
use crate::data::midi::channel::Channel::{Channel1, Channel2};
|
||||||
|
use crate::data::midi::notes::Note;
|
||||||
|
use crate::data::byte::u7::U7;
|
||||||
|
use crate::data::midi::message::Message;
|
||||||
|
use crate::data::usb_midi::cable_number::CableNumber::{Cable0,Cable1};
|
||||||
|
use crate::data::midi::message::control_function::ControlFunction;
|
||||||
|
|
||||||
|
macro_rules! decode_message_test {
|
||||||
|
($($id:ident:$value:expr,)*) => {
|
||||||
|
$(
|
||||||
|
#[test]
|
||||||
|
fn $id() {
|
||||||
|
let (usb_midi_data_packet,expected) = $value;
|
||||||
|
let message = UsbMidiEventPacket::try_from(&usb_midi_data_packet[..]).unwrap();
|
||||||
|
assert_eq!(expected, message);
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
decode_message_test! {
|
||||||
|
note_on: ([9, 144, 36, 127], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable0,
|
||||||
|
message: Message::NoteOn(Channel1, Note::C2, U7(127))
|
||||||
|
}),
|
||||||
|
note_off: ([8, 128, 36, 0], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable0,
|
||||||
|
message: Message::NoteOff(Channel1, Note::C2, U7(0))
|
||||||
|
}),
|
||||||
|
polyphonic_aftertouch: ([10, 160, 36, 64], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable0,
|
||||||
|
message: Message::PolyphonicAftertouch(Channel1, Note::C2, U7(64))
|
||||||
|
}),
|
||||||
|
program_change: ([28, 192, 127, 0], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable1,
|
||||||
|
message: Message::ProgramChange(Channel1, U7(127))
|
||||||
|
}),
|
||||||
|
channel_aftertouch: ([13, 208, 127, 0], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable0,
|
||||||
|
message: Message::ChannelAftertouch(Channel1, U7(127))
|
||||||
|
}),
|
||||||
|
pitch_wheel: ([14, 224, 64, 32], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable0,
|
||||||
|
message: Message::PitchWheelChange(Channel1, U7(64), U7(32))
|
||||||
|
}),
|
||||||
|
control_change: ([11, 177, 1, 32], UsbMidiEventPacket {
|
||||||
|
cable_number: Cable0,
|
||||||
|
message: Message::ControlChange(Channel2, ControlFunction::MOD_WHEEL_1, U7(32))
|
||||||
|
}),
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue