shizen_buffers/midi/
midi_buffer.rs

1use std::ops::{Deref, DerefMut};
2
3use super::midi_message::MidiMessage;
4
5pub type MidiMessageBytes = [u8; 3];
6pub type _MidiEvent = (u64, MidiMessageBytes);
7
8#[derive(Debug, Clone, PartialEq, PartialOrd, Hash)]
9pub struct MidiBuffer {
10    pub(crate) messages: Vec<MidiMessage>,
11}
12
13impl Deref for MidiBuffer {
14    type Target = Vec<MidiMessage>;
15
16    fn deref(&self) -> &Self::Target {
17        &self.messages
18    }
19}
20
21impl DerefMut for MidiBuffer {
22    fn deref_mut(&mut self) -> &mut Self::Target {
23        &mut self.messages
24    }
25}
26
27impl MidiBuffer {
28    pub const fn new() -> Self {
29        Self {
30            messages: Vec::new(),
31        }
32    }
33
34    pub fn transpose(&mut self, interval: i8) {
35        self.messages.iter_mut().for_each(|m| m.transpose(interval));
36    }
37}
38
39impl FromIterator<MidiMessageBytes> for MidiBuffer {
40    fn from_iter<T: IntoIterator<Item = MidiMessageBytes>>(iter: T) -> Self {
41        Self {
42            messages: iter.into_iter().map(MidiMessage::from_bytes).collect(),
43        }
44    }
45}
46
47impl FromIterator<MidiMessage> for MidiBuffer {
48    fn from_iter<T: IntoIterator<Item = MidiMessage>>(iter: T) -> Self {
49        Self {
50            messages: iter.into_iter().collect(),
51        }
52    }
53}
54
55impl crate::Buffer for MidiBuffer {}
56// impl<I> Buffer for I where I: Iterator<Item = MidiMessage> {}