midi_control/transport.rs
1//
2// (c) 2020 Hubert Figuière
3//
4// License: LGPL-3.0-or-later
5
6//! Transport for MIDI
7
8use crate::MidiMessage;
9
10/// Trait to implement sending messages
11///
12/// ## Example
13///
14/// Sending a Note On message:
15///
16/// ```no_run
17/// use midi_control::{Channel,MidiMessage, KeyEvent};
18/// use midi_control::transport::MidiMessageSend; // to use the trait
19/// use midir;
20///
21/// let out = midir::MidiOutput::new("MIDITest").unwrap();
22/// let port = &out.ports()[0];
23/// if let Ok(mut midi_out) = out.connect(port, "MIDI device") {
24/// let message = MidiMessage::NoteOn(Channel::Ch1, KeyEvent{key:60, value:127});
25/// midi_out.send_message(message);
26/// }
27/// ```
28pub trait MidiMessageSend {
29 /// The error type to return on send.
30 type Error;
31
32 /// Send a `MidiMessage` over this transport layer.
33 /// Return a `Self::Error` if any. For implementor of the trait this usually
34 /// will be their own `Error` type.
35 fn send_message(&mut self, message: MidiMessage) -> Result<(), Self::Error>;
36}
37
38#[cfg(feature = "transport")]
39impl MidiMessageSend for midir::MidiOutputConnection {
40 type Error = midir::SendError;
41
42 /// Send a `MidiMessage` over a `midir::OutputConnection`
43 fn send_message(&mut self, message: MidiMessage) -> Result<(), Self::Error> {
44 let raw: Vec<u8> = message.into();
45 self.send(raw.as_slice())
46 }
47}