1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use super::MidiNote;

pub struct NoteMessage {
    pub note: MidiNote,
    pub velocity: u8,
}

pub enum Message {
    NoteOff(NoteMessage),
    NoteOn(NoteMessage),
}

impl FromIterator<u8> for Message {
    fn from_iter<T: IntoIterator<Item = u8>>(iter: T) -> Self {
        let mut iter = iter.into_iter();
        let status = iter.next().unwrap();
        match status >> 4 {
            0b1000 => {
                let note = MidiNote::from_byte(iter.next().unwrap());
                let velocity = iter.next().unwrap();
                Message::NoteOff(NoteMessage { note, velocity })
            }
            0b1001 => {
                let note = MidiNote::from_byte(iter.next().unwrap());
                let velocity = iter.next().unwrap();
                Message::NoteOn(NoteMessage { note, velocity })
            }
            _ => todo!(),
        }
    }
}