usbd_midi/message/
channel.rs

1//! Enum representing the MIDI channel.
2
3/// The Channel is a value ranging from 0x0 to 0xF.
4///
5/// This is a standard midi concept.
6/// Note Channel1 = 0 on the wire.
7#[derive(Debug, Copy, Clone, Eq, PartialEq)]
8#[repr(u8)]
9pub enum Channel {
10    /// MIDI channel 1.
11    Channel1 = 0x0,
12    /// MIDI channel 2.
13    Channel2 = 0x1,
14    /// MIDI channel 3.
15    Channel3 = 0x2,
16    /// MIDI channel 4.
17    Channel4 = 0x3,
18    /// MIDI channel 5.
19    Channel5 = 0x4,
20    /// MIDI channel 6.
21    Channel6 = 0x5,
22    /// MIDI channel 7.
23    Channel7 = 0x6,
24    /// MIDI channel 8.
25    Channel8 = 0x7,
26    /// MIDI channel 9.
27    Channel9 = 0x8,
28    /// MIDI channel 10.
29    Channel10 = 0x9,
30    /// MIDI channel 11.
31    Channel11 = 0xA,
32    /// MIDI channel 12.
33    Channel12 = 0xB,
34    /// MIDI channel 13.
35    Channel13 = 0xC,
36    /// MIDI channel 14.
37    Channel14 = 0xD,
38    /// MIDI channel 15.
39    Channel15 = 0xE,
40    /// MIDI channel 16.
41    Channel16 = 0xF,
42}
43
44/// Error indicating an invalid MIDI channel.
45pub struct InvalidChannel(pub u8);
46
47impl TryFrom<u8> for Channel {
48    type Error = InvalidChannel;
49    fn try_from(value: u8) -> Result<Self, Self::Error> {
50        match value {
51            x if x == Channel::Channel1 as u8 => Ok(Channel::Channel1),
52            x if x == Channel::Channel2 as u8 => Ok(Channel::Channel2),
53            x if x == Channel::Channel3 as u8 => Ok(Channel::Channel3),
54            x if x == Channel::Channel4 as u8 => Ok(Channel::Channel4),
55            x if x == Channel::Channel5 as u8 => Ok(Channel::Channel5),
56            x if x == Channel::Channel6 as u8 => Ok(Channel::Channel6),
57            x if x == Channel::Channel7 as u8 => Ok(Channel::Channel7),
58            x if x == Channel::Channel8 as u8 => Ok(Channel::Channel8),
59            x if x == Channel::Channel9 as u8 => Ok(Channel::Channel9),
60            x if x == Channel::Channel10 as u8 => Ok(Channel::Channel10),
61            x if x == Channel::Channel11 as u8 => Ok(Channel::Channel11),
62            x if x == Channel::Channel12 as u8 => Ok(Channel::Channel12),
63            x if x == Channel::Channel13 as u8 => Ok(Channel::Channel13),
64            x if x == Channel::Channel14 as u8 => Ok(Channel::Channel14),
65            x if x == Channel::Channel15 as u8 => Ok(Channel::Channel15),
66            x if x == Channel::Channel16 as u8 => Ok(Channel::Channel16),
67            _ => Err(InvalidChannel(value)),
68        }
69    }
70}
71
72impl From<Channel> for u8 {
73    fn from(src: Channel) -> u8 {
74        src as u8
75    }
76}
77
78#[cfg(test)]
79mod tests {
80
81    use super::*;
82    macro_rules! channel_test {
83        ($($id:ident:$value:expr,)*) => {
84            $(
85                #[test]
86                fn $id() {
87                    let (input,expected) = $value;
88                    assert_eq!(input as u8, expected);
89                }
90            )*
91        }
92    }
93
94    channel_test! {
95            channel_1:   (Channel::Channel1,0),
96            channel_2:   (Channel::Channel2,1),
97            channel_3:   (Channel::Channel3,2),
98            channel_4:   (Channel::Channel4,3),
99            channel_5:   (Channel::Channel5,4),
100            channel_6:   (Channel::Channel6,5),
101            channel_7:   (Channel::Channel7,6),
102            channel_8:   (Channel::Channel8,7),
103            channel_9:   (Channel::Channel9,8),
104            channel_10:  (Channel::Channel10,9),
105            channel_11:  (Channel::Channel11,10),
106            channel_12:  (Channel::Channel12,11),
107            channel_13:  (Channel::Channel13,12),
108            channel_14:  (Channel::Channel14,13),
109            channel_15:  (Channel::Channel15,14),
110            channel_16:  (Channel::Channel16,15),
111    }
112}