Skip to main content

midi_toolkit/sequence/event/
track.rs

1use crate::{
2    events::{BatchTempo, MIDIEvent, MIDIEventEnum, SerializeEvent},
3    io::MIDIWriteError,
4    num::MIDINum,
5};
6
7use super::Delta;
8
9#[derive(Debug, Clone)]
10pub struct Track<T> {
11    pub event: T,
12    pub track: u32,
13}
14
15impl<T> Track<T> {
16    pub fn new(event: T, track: u32) -> Self {
17        Self { event, track }
18    }
19
20    pub fn inner_event(self) -> T {
21        self.event
22    }
23}
24
25impl<T> std::ops::Deref for Track<T> {
26    type Target = T;
27
28    fn deref(&self) -> &Self::Target {
29        &self.event
30    }
31}
32
33impl<T> std::ops::DerefMut for Track<T> {
34    fn deref_mut(&mut self) -> &mut Self::Target {
35        &mut self.event
36    }
37}
38
39impl<T: SerializeEvent> SerializeEvent for Track<T> {
40    fn serialize_event<W: std::io::Write>(&self, buf: &mut W) -> Result<usize, MIDIWriteError> {
41        self.event.serialize_event(buf)
42    }
43}
44
45impl<E: MIDIEvent> MIDIEvent for Track<E> {
46    fn key(&self) -> Option<u8> {
47        self.event.key()
48    }
49
50    fn key_mut(&mut self) -> Option<&mut u8> {
51        self.event.key_mut()
52    }
53
54    fn channel(&self) -> Option<u8> {
55        self.event.channel()
56    }
57
58    fn channel_mut(&mut self) -> Option<&mut u8> {
59        self.event.channel_mut()
60    }
61
62    fn as_u32(&self) -> Option<u32> {
63        self.event.as_u32()
64    }
65}
66
67impl<E: MIDIEventEnum> MIDIEventEnum for Track<E> {
68    fn as_event(&self) -> &crate::events::Event {
69        self.event.as_event()
70    }
71
72    fn as_event_mut(&mut self) -> &mut crate::events::Event {
73        self.event.as_event_mut()
74    }
75}
76
77impl<E: BatchTempo> BatchTempo for Track<E> {
78    fn inner_tempo(&self) -> Option<u32> {
79        self.event.inner_tempo()
80    }
81
82    fn without_tempo(self) -> Option<Self> {
83        let track = self.track;
84        self.event
85            .without_tempo()
86            .map(|event| Self::new(event, track))
87    }
88}
89
90pub fn into_track_events<D: MIDINum, E, Err>(
91    iter: impl Iterator<Item = Result<Delta<D, E>, Err>>,
92    track: u32,
93) -> impl Iterator<Item = Result<Delta<D, Track<E>>, Err>> {
94    iter.map(move |e| e.map(|e| Delta::new(e.delta, Track::new(e.event, track))))
95}