auto-musik

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | LICENSE

midi_io.rs (1418B)


      1 use midir::{MidiOutput, MidiOutputConnection, MidiOutputPort};
      2 
      3 pub struct MidiTransmitter {
      4     conn: MidiOutputConnection,
      5 }
      6 
      7 type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
      8 
      9 impl MidiTransmitter {
     10     pub fn new(port_name: &str) -> Result<Self> {
     11         let midi_out = MidiOutput::new("Rust Midi Generator")?;
     12 
     13         let out_port = Self::find_port(&midi_out, port_name)?;
     14         let actual_port_name = midi_out.port_name(&out_port)?;
     15 
     16         println!("We use to connect port: {}", actual_port_name);
     17 
     18         let conn = midi_out.connect(&out_port, "midir-output-port")?;
     19 
     20         Ok(MidiTransmitter { conn })
     21     }
     22 
     23     fn find_port(midi_out: &MidiOutput, search_name: &str) -> Result<MidiOutputPort> {
     24         for port in midi_out.ports().iter() {
     25             let name = midi_out.port_name(port)?;
     26             if name.contains(search_name) {
     27                 return Ok(port.clone());
     28             }
     29         }
     30 
     31         Err(format!("Midi port named '{}' was not found ", search_name).into())
     32     }
     33 
     34     pub fn send_message(&mut self, message: &[u8]) -> std::result::Result<(), midir::SendError> {
     35         self.conn.send(message)
     36     }
     37 
     38     pub fn get_port_names(midi_out: &MidiOutput) -> Vec<String> {
     39         midi_out
     40             .ports()
     41             .iter()
     42             .filter_map(|p| midi_out.port_name(p).ok())
     43             .collect()
     44     }
     45 }