midi_toolkit/sequence/event/
track.rs1use 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}