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!(),
}
}
}