summaryrefslogtreecommitdiffstats
path: root/third_party/rust/midir/examples/test_sysex.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/midir/examples/test_sysex.rs')
-rw-r--r--third_party/rust/midir/examples/test_sysex.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/third_party/rust/midir/examples/test_sysex.rs b/third_party/rust/midir/examples/test_sysex.rs
new file mode 100644
index 0000000000..79149b3c39
--- /dev/null
+++ b/third_party/rust/midir/examples/test_sysex.rs
@@ -0,0 +1,79 @@
+extern crate midir;
+
+fn main() {
+ match example::run() {
+ Ok(_) => (),
+ Err(err) => println!("Error: {}", err)
+ }
+}
+
+#[cfg(not(any(windows, target_arch = "wasm32")))] // virtual ports are not supported on Windows nor on Web MIDI
+mod example {
+
+use std::thread::sleep;
+use std::time::Duration;
+use std::error::Error;
+
+use midir::{MidiInput, MidiOutput, Ignore};
+use midir::os::unix::VirtualInput;
+
+const LARGE_SYSEX_SIZE: usize = 5572; // This is the maximum that worked for me
+
+pub fn run() -> Result<(), Box<dyn Error>> {
+ let mut midi_in = MidiInput::new("My Test Input")?;
+ midi_in.ignore(Ignore::None);
+ let midi_out = MidiOutput::new("My Test Output")?;
+
+ let previous_count = midi_out.port_count();
+
+ println!("Creating virtual input port ...");
+ let conn_in = midi_in.create_virtual("midir-test", |stamp, message, _| {
+ println!("{}: {:?} (len = {})", stamp, message, message.len());
+ }, ())?;
+
+ assert_eq!(midi_out.port_count(), previous_count + 1);
+
+ let out_ports = midi_out.ports();
+ let new_port = out_ports.last().unwrap();
+ println!("Connecting to port '{}' ...", midi_out.port_name(&new_port).unwrap());
+ let mut conn_out = midi_out.connect(&new_port, "midir-test")?;
+ println!("Starting to send messages ...");
+ //sleep(Duration::from_millis(2000));
+ println!("Sending NoteOn message");
+ conn_out.send(&[144, 60, 1])?;
+ sleep(Duration::from_millis(200));
+ println!("Sending small SysEx message ...");
+ conn_out.send(&[0xF0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF7])?;
+ sleep(Duration::from_millis(200));
+ println!("Sending large SysEx message ...");
+ let mut v = Vec::with_capacity(LARGE_SYSEX_SIZE);
+ v.push(0xF0u8);
+ for _ in 1..LARGE_SYSEX_SIZE-1 {
+ v.push(0u8);
+ }
+ v.push(0xF7u8);
+ assert_eq!(v.len(), LARGE_SYSEX_SIZE);
+ conn_out.send(&v)?;
+ sleep(Duration::from_millis(200));
+ // FIXME: the following doesn't seem to work with ALSA
+ println!("Sending large SysEx message (chunked)...");
+ for ch in v.chunks(4) {
+ conn_out.send(ch)?;
+ }
+ sleep(Duration::from_millis(200));
+ println!("Sending small SysEx message ...");
+ conn_out.send(&[0xF0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF7])?;
+ sleep(Duration::from_millis(200));
+ println!("Closing output ...");
+ conn_out.close();
+ println!("Closing virtual input ...");
+ conn_in.close().0;
+ Ok(())
+}
+}
+
+ // needed to compile successfully
+#[cfg(any(windows, target_arch = "wasm32"))] mod example {
+ use std::error::Error;
+ pub fn run() -> Result<(), Box<dyn Error>> { Ok(()) }
+}