music_note/midi/
message.rs

1use super::MidiNote;
2
3pub struct NoteMessage {
4    pub note: MidiNote,
5    pub velocity: u8,
6}
7
8pub enum Message {
9    NoteOff(NoteMessage),
10    NoteOn(NoteMessage),
11}
12
13impl FromIterator<u8> for Message {
14    fn from_iter<T: IntoIterator<Item = u8>>(iter: T) -> Self {
15        let mut iter = iter.into_iter();
16        let status = iter.next().unwrap();
17        match status >> 4 {
18            0b1000 => {
19                let note = MidiNote::from_byte(iter.next().unwrap());
20                let velocity = iter.next().unwrap();
21                Message::NoteOff(NoteMessage { note, velocity })
22            }
23            0b1001 => {
24                let note = MidiNote::from_byte(iter.next().unwrap());
25                let velocity = iter.next().unwrap();
26                Message::NoteOn(NoteMessage { note, velocity })
27            }
28            _ => todo!(),
29        }
30    }
31}