midi_convert/
lib.rs

1//! # midi_convert
2//!
3//! Utilities for converting to/from `midi_types::MidiMessage`
4//!
5//! # Examples
6//!
7//! Render a `MidiMessage` into a byte slice.
8//! ```
9//! use midi_convert::render_slice::MidiRenderSlice;
10//! use midi_types::MidiMessage;
11//!
12//! let mut s = [0u8; 3];
13//! let m = MidiMessage::NoteOn(2.into(), 0x76.into(), 0x34.into());
14//! assert_eq!(m.render_slice(&mut s), 3);
15//! assert_eq!(s, [0x92, 0x76, 0x34]);
16//! ```
17//!
18//! Try to extract a `MidiMessage` from a byte slice.
19//! ```
20//! use midi_convert::parse::{MidiTryParseSlice, MidiParseError};
21//! use midi_types::MidiMessage;
22//!
23//! assert_eq!(MidiMessage::try_parse_slice(&[0x92, 0x76, 0x34]), Ok(MidiMessage::NoteOn(2.into(), 0x76.into(), 0x34.into())));
24//! assert_eq!(MidiMessage::try_parse_slice(&[0x92]), Err(MidiParseError::BufferTooShort));
25//! ```
26//!
27//! Parse a byte stream, returning `MidiMessage` found along the way.
28//! ```
29//! use midi_convert::parse::{MidiParser};
30//! use midi_types::MidiMessage;
31//!
32//! let mut parser = MidiParser::new();
33//! assert_eq!(parser.parse(0x92), None);
34//! assert_eq!(parser.parse(0x76), None);
35//! assert_eq!(parser.parse(0x34), Some(MidiMessage::NoteOn(2.into(), 0x76.into(), 0x34.into())));
36//! ```
37//!
38
39#![no_std]
40#[warn(missing_debug_implementations, missing_docs)]
41pub mod parse;
42pub mod render;
43pub mod render_slice;
44
45pub use midi_types;
46
47#[cfg(test)]
48pub(crate) mod test {
49    use {
50        crate::{parse::MidiTryParseSlice, render_slice::MidiRenderSlice},
51        midi_types::{Channel, Control, MidiMessage, Note, Program, QuarterFrame, Value14, Value7},
52    };
53
54    lazy_static::lazy_static! {
55        pub(crate) static ref TEST_1BYTE: [MidiMessage; 7] = [
56            MidiMessage::TuneRequest,
57            MidiMessage::TimingClock,
58            MidiMessage::Start,
59            MidiMessage::Continue,
60            MidiMessage::Stop,
61            MidiMessage::ActiveSensing,
62            MidiMessage::Reset,
63        ];
64        pub(crate) static ref TEST_2BYTE: [MidiMessage; 4] = [
65            MidiMessage::ProgramChange(Channel::from(0), Program::from(0)),
66            MidiMessage::ChannelPressure(Channel::from(1), Value7::from(2)),
67            MidiMessage::QuarterFrame(QuarterFrame::from(23)),
68            MidiMessage::SongSelect(Value7::from(3)),
69        ];
70        pub(crate) static ref TEST_3BYTE: [MidiMessage; 6] = [
71            MidiMessage::NoteOff(Channel::from(2), Note::from(3), Value7::from(1)),
72            MidiMessage::NoteOn(Channel::from(3), Note::from(120), Value7::from(120)),
73            MidiMessage::KeyPressure(Channel::from(3), Note::from(120), Value7::from(1)),
74            MidiMessage::ControlChange(Channel::from(5), Control::from(23), Value7::from(23)),
75            MidiMessage::PitchBendChange(Channel::from(15), Value14::from((23, 23))),
76            MidiMessage::SongPositionPointer(Value14::from((0, 0))),
77        ];
78    }
79
80    #[test]
81    fn parse_rendered() {
82        let mut buf3 = [0, 0, 0];
83        let mut buf100 = [0; 100];
84        for v in (*TEST_1BYTE).iter() {
85            assert_eq!(1, v.render_slice(&mut buf3), "{:?}", v);
86            assert_eq!(Ok(v.clone()), MidiMessage::try_parse_slice(buf3.as_slice()));
87            assert_eq!(1, v.render_slice(&mut buf100), "{:?}", v);
88            assert_eq!(
89                Ok(v.clone()),
90                MidiMessage::try_parse_slice(buf100.as_slice())
91            );
92        }
93
94        for v in (*TEST_2BYTE).iter() {
95            assert_eq!(2, v.render_slice(&mut buf3), "{:?}", v);
96            assert_eq!(Ok(v.clone()), MidiMessage::try_parse_slice(buf3.as_slice()));
97            assert_eq!(2, v.render_slice(&mut buf100), "{:?}", v);
98            assert_eq!(
99                Ok(v.clone()),
100                MidiMessage::try_parse_slice(buf100.as_slice())
101            );
102        }
103
104        for v in (*TEST_3BYTE).iter() {
105            assert_eq!(3, v.render_slice(&mut buf3), "{:?}", v);
106            assert_eq!(Ok(v.clone()), MidiMessage::try_parse_slice(buf3.as_slice()));
107            assert_eq!(3, v.render_slice(&mut buf100), "{:?}", v);
108            assert_eq!(
109                Ok(v.clone()),
110                MidiMessage::try_parse_slice(buf100.as_slice())
111            );
112        }
113    }
114}