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 }