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}