midi_toolkit/events/
event_variants.rs

1use crate::events::encode_var_length_value;
2use crate::io::MIDIWriteError;
3use crate::sequence::event::Delta;
4
5use super::event::Event;
6use super::{ChannelEvent, KeyEvent, MIDIEvent, MIDINum, PlaybackEvent, SerializeEvent};
7use derive::{MIDIEvent, NewEvent};
8
9#[derive(Debug, Clone, Copy, PartialEq)]
10pub struct MIDIColor {
11    pub r: u8,
12    pub g: u8,
13    pub b: u8,
14    pub a: u8,
15}
16
17#[derive(Debug, Clone, PartialEq, Copy)]
18pub enum TextEventKind {
19    TextEvent = 1,
20    CopyrightNotice = 2,
21    TrackName = 3,
22    InstrumentName = 4,
23    Lyric = 5,
24    Marker = 6,
25    CuePoint = 7,
26    ProgramName = 8,
27    DeviceName = 9,
28    Undefined = 10,
29    MetaEvent = 0x7F,
30}
31
32impl TextEventKind {
33    pub fn from_val(val: u8) -> TextEventKind {
34        match val {
35            1 => TextEventKind::TextEvent,
36            2 => TextEventKind::CopyrightNotice,
37            3 => TextEventKind::TrackName,
38            4 => TextEventKind::InstrumentName,
39            5 => TextEventKind::Lyric,
40            6 => TextEventKind::Marker,
41            7 => TextEventKind::CuePoint,
42            8 => TextEventKind::ProgramName,
43            9 => TextEventKind::DeviceName,
44            10 => TextEventKind::Undefined,
45            0x7F => TextEventKind::MetaEvent,
46            _ => TextEventKind::Undefined,
47        }
48    }
49}
50
51#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
52#[playback]
53pub struct NoteOnEvent {
54    #[channel]
55    pub channel: u8,
56    #[key]
57    pub key: u8,
58    pub velocity: u8,
59}
60
61impl SerializeEvent for NoteOnEvent {
62    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
63        let event = [0x90 | self.channel, self.key, self.velocity];
64        Ok(buf.write(&event)?)
65    }
66}
67
68impl PlaybackEvent for NoteOnEvent {
69    fn as_u32(&self) -> u32 {
70        (0x90 | self.channel as u32) | (self.key as u32) << 8 | (self.velocity as u32) << 16
71    }
72}
73
74#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
75#[playback]
76pub struct NoteOffEvent {
77    #[channel]
78    pub channel: u8,
79    #[key]
80    pub key: u8,
81}
82
83impl SerializeEvent for NoteOffEvent {
84    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
85        let event = [0x80 | self.channel, self.key, 0];
86        Ok(buf.write(&event)?)
87    }
88}
89
90impl PlaybackEvent for NoteOffEvent {
91    fn as_u32(&self) -> u32 {
92        (0x80 | self.channel as u32) | (self.key as u32) << 8
93    }
94}
95
96#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
97#[playback]
98pub struct PolyphonicKeyPressureEvent {
99    #[channel]
100    pub channel: u8,
101    #[key]
102    pub key: u8,
103    pub velocity: u8,
104}
105
106impl SerializeEvent for PolyphonicKeyPressureEvent {
107    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
108        let event = [0xA0 | self.channel, self.key, self.velocity];
109        Ok(buf.write(&event)?)
110    }
111}
112
113impl PlaybackEvent for PolyphonicKeyPressureEvent {
114    fn as_u32(&self) -> u32 {
115        (0xA0 | self.channel as u32) | (self.key as u32) << 8 | (self.velocity as u32) << 16
116    }
117}
118
119#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
120#[playback]
121pub struct ControlChangeEvent {
122    #[channel]
123    pub channel: u8,
124    pub controller: u8,
125    pub value: u8,
126}
127
128impl SerializeEvent for ControlChangeEvent {
129    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
130        let event = [0xB0 | self.channel, self.controller, self.value];
131        Ok(buf.write(&event)?)
132    }
133}
134
135impl PlaybackEvent for ControlChangeEvent {
136    fn as_u32(&self) -> u32 {
137        (0xB0 | self.channel as u32) | (self.controller as u32) << 8 | (self.value as u32) << 16
138    }
139}
140
141#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
142#[playback]
143pub struct ProgramChangeEvent {
144    #[channel]
145    pub channel: u8,
146    pub program: u8,
147}
148
149impl SerializeEvent for ProgramChangeEvent {
150    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
151        let event = [0xC0 | self.channel, self.program];
152        Ok(buf.write(&event)?)
153    }
154}
155
156impl PlaybackEvent for ProgramChangeEvent {
157    fn as_u32(&self) -> u32 {
158        (0xC0 | self.channel as u32) | (self.program as u32) << 8
159    }
160}
161
162#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
163#[playback]
164pub struct ChannelPressureEvent {
165    #[channel]
166    pub channel: u8,
167    pub pressure: u8,
168}
169
170impl SerializeEvent for ChannelPressureEvent {
171    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
172        let event = [0xD0 | self.channel, self.pressure];
173        Ok(buf.write(&event)?)
174    }
175}
176
177impl PlaybackEvent for ChannelPressureEvent {
178    fn as_u32(&self) -> u32 {
179        (0xD0 | self.channel as u32) | (self.pressure as u32) << 8
180    }
181}
182
183#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
184#[playback]
185pub struct PitchWheelChangeEvent {
186    #[channel]
187    pub channel: u8,
188    pub pitch: i16,
189}
190
191impl SerializeEvent for PitchWheelChangeEvent {
192    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
193        let value = self.pitch + 8192;
194        let event = [
195            0xE0 | self.channel,
196            (value & 0x7F) as u8,
197            ((value >> 7) & 0x7F) as u8,
198        ];
199        Ok(buf.write(&event)?)
200    }
201}
202
203impl PlaybackEvent for PitchWheelChangeEvent {
204    fn as_u32(&self) -> u32 {
205        let value = self.pitch + 8192;
206        let val1 = value & 0x7F;
207        let val2 = (value >> 7) & 0x7F;
208        (0xE0 | self.channel as u32) | (val1 as u32) << 8 | (val2 as u32) << 16
209    }
210}
211
212#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
213pub struct SystemExclusiveMessageEvent {
214    pub data: Vec<u8>,
215}
216
217impl SerializeEvent for SystemExclusiveMessageEvent {
218    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
219        let mut vec = Vec::with_capacity(self.data.len() + 2);
220        vec.push(0xF0u8);
221        for v in self.data.iter() {
222            vec.push(*v);
223        }
224        vec.push(0xF7u8);
225        Ok(buf.write(&vec)?)
226    }
227}
228
229#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
230pub struct UndefinedEvent {
231    pub event: u8,
232}
233
234impl SerializeEvent for UndefinedEvent {
235    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
236        let event = [self.event];
237        Ok(buf.write(&event)?)
238    }
239}
240
241#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
242pub struct SongPositionPointerEvent {
243    pub position: u16,
244}
245
246impl SerializeEvent for SongPositionPointerEvent {
247    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
248        let event = [
249            0xF2,
250            (self.position & 0x7F) as u8,
251            ((self.position >> 7) & 0x7F) as u8,
252        ];
253        Ok(buf.write(&event)?)
254    }
255}
256
257#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
258pub struct SongSelectEvent {
259    pub song: u8,
260}
261
262impl SerializeEvent for SongSelectEvent {
263    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
264        let event = [0xF3, self.song];
265        Ok(buf.write(&event)?)
266    }
267}
268
269#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
270pub struct TuneRequestEvent {}
271
272impl SerializeEvent for TuneRequestEvent {
273    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
274        let event = [0xF6];
275        Ok(buf.write(&event)?)
276    }
277}
278
279#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
280pub struct EndOfExclusiveEvent {}
281
282impl SerializeEvent for EndOfExclusiveEvent {
283    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
284        let event = [0xF7];
285        Ok(buf.write(&event)?)
286    }
287}
288
289#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
290pub struct TrackStartEvent {}
291
292impl SerializeEvent for TrackStartEvent {
293    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
294        let event = [0xFF, 0x00, 0x02];
295        Ok(buf.write(&event)?)
296    }
297}
298
299#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
300pub struct TextEvent {
301    pub kind: TextEventKind,
302    pub bytes: Vec<u8>,
303}
304
305impl SerializeEvent for TextEvent {
306    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
307        let mut vec = Vec::with_capacity(self.bytes.len() + 2);
308        vec.push(0xFF);
309        vec.push(self.kind as u8);
310        vec.append(&mut encode_var_length_value(self.bytes.len() as u64));
311        for v in self.bytes.iter() {
312            vec.push(*v);
313        }
314        Ok(buf.write(&vec)?)
315    }
316}
317
318#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
319pub struct UnknownMetaEvent {
320    pub kind: u8,
321    pub bytes: Vec<u8>,
322}
323
324impl SerializeEvent for UnknownMetaEvent {
325    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
326        let mut vec = Vec::with_capacity(self.bytes.len() + 2);
327        vec.push(0xFF);
328        vec.push(self.kind);
329        vec.append(&mut encode_var_length_value(self.bytes.len() as u64));
330        for v in self.bytes.iter() {
331            vec.push(*v);
332        }
333        Ok(buf.write(&vec)?)
334    }
335}
336
337#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
338pub struct ColorEvent {
339    pub channel: u8,
340    pub col: MIDIColor,
341    pub col2: Option<MIDIColor>,
342}
343
344impl SerializeEvent for ColorEvent {
345    fn serialize_event<T: std::io::Write>(&self, _buf: &mut T) -> Result<usize, MIDIWriteError> {
346        todo!();
347    }
348}
349
350#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
351pub struct ChannelPrefixEvent {
352    #[channel]
353    pub channel: u8,
354}
355
356impl SerializeEvent for ChannelPrefixEvent {
357    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
358        let event = [0xFF, 0x20, 0x01, self.channel];
359        Ok(buf.write(&event)?)
360    }
361}
362
363#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
364pub struct MIDIPortEvent {
365    #[channel]
366    pub channel: u8,
367}
368
369impl SerializeEvent for MIDIPortEvent {
370    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
371        let event = [0xFF, 0x21, 0x01, self.channel];
372        Ok(buf.write(&event)?)
373    }
374}
375
376#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
377pub struct TempoEvent {
378    pub tempo: u32,
379}
380
381impl SerializeEvent for TempoEvent {
382    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
383        let event = [
384            0xFF,
385            0x51,
386            0x03,
387            ((self.tempo >> 16) & 0xFF) as u8,
388            ((self.tempo >> 8) & 0xFF) as u8,
389            (self.tempo & 0xFF) as u8,
390        ];
391        Ok(buf.write(&event)?)
392    }
393}
394
395#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
396pub struct SMPTEOffsetEvent {
397    pub hours: u8,
398    pub minutes: u8,
399    pub seconds: u8,
400    pub frames: u8,
401    pub fractional_frames: u8,
402}
403
404impl SerializeEvent for SMPTEOffsetEvent {
405    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
406        let event = [
407            0xFF,
408            0x54,
409            0x05,
410            self.hours,
411            self.minutes,
412            self.seconds,
413            self.frames,
414            self.fractional_frames,
415        ];
416        Ok(buf.write(&event)?)
417    }
418}
419
420#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
421pub struct TimeSignatureEvent {
422    pub numerator: u8,
423    pub denominator: u8,
424    pub ticks_per_click: u8,
425    pub bb: u8,
426}
427
428impl SerializeEvent for TimeSignatureEvent {
429    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
430        let event = [
431            0xFF,
432            0x58,
433            0x04,
434            self.numerator,
435            self.denominator,
436            self.ticks_per_click,
437            self.bb,
438        ];
439        Ok(buf.write(&event)?)
440    }
441}
442
443#[derive(Debug, MIDIEvent, Clone, NewEvent, PartialEq)]
444pub struct KeySignatureEvent {
445    pub sf: u8,
446    pub mi: u8,
447}
448
449impl SerializeEvent for KeySignatureEvent {
450    fn serialize_event<T: std::io::Write>(&self, buf: &mut T) -> Result<usize, MIDIWriteError> {
451        let event = [0xFF, 0x59, 0x02, self.sf, self.mi];
452        Ok(buf.write(&event)?)
453    }
454}