[+] Rust main
This commit is contained in:
+75
@@ -0,0 +1,75 @@
|
||||
use std::io::{BufRead, BufReader};
|
||||
use std::process::exit;
|
||||
|
||||
use anyhow::Result;
|
||||
use log::info;
|
||||
use midir::MidiOutput;
|
||||
use midir::os::unix::VirtualOutput;
|
||||
|
||||
fn start() -> Result<()> {
|
||||
let midi_out = MidiOutput::new("MIDI Output")?;
|
||||
let mut conn_out = midi_out.create_virtual("Virtual MIDI Output").unwrap();
|
||||
|
||||
let serial_port = serialport::new("/dev/cu.usbserial-142140", 9600)
|
||||
.timeout(std::time::Duration::from_millis(10))
|
||||
.open()?;
|
||||
let mut reader = BufReader::new(serial_port);
|
||||
|
||||
let mut buf = Vec::new();
|
||||
|
||||
info!("Starting");
|
||||
|
||||
loop {
|
||||
match reader.read_until(b'\n', &mut buf) {
|
||||
Ok(t) => {
|
||||
if t == 0 { continue }
|
||||
|
||||
// Convert buffer to string
|
||||
let mut line = String::from_utf8_lossy(&buf).to_string();
|
||||
line = line.trim().to_string();
|
||||
buf.clear();
|
||||
|
||||
println!("{}", line);
|
||||
|
||||
// Only process commands
|
||||
if !line.starts_with("/") { continue }
|
||||
|
||||
// Split command arguments
|
||||
let args: Vec<&str> = line.split_whitespace().collect();
|
||||
|
||||
// Command /hit <note> <velocity>
|
||||
// Usage example: /hit 60 127
|
||||
if args[0] == "/hit" {
|
||||
let note = args[1].parse::<u8>()?;
|
||||
// let note = 72; // c5
|
||||
let velocity = args[2].parse::<u8>()?;
|
||||
conn_out.send(&[0x99, note, velocity]).unwrap();
|
||||
|
||||
// Since it's an instant hit, we need to send a note off
|
||||
// Sleep for 10ms to make sure the note off is sent after the note on
|
||||
// std::thread::sleep(std::time::Duration::from_millis(10));
|
||||
conn_out.send(&[0x89, note, 0]).unwrap();
|
||||
}
|
||||
|
||||
// Command /pedal <0 = off / 1 = on>
|
||||
// Usage example: /pedal 0
|
||||
if args[0] == "/pedal" {
|
||||
let pedal = args[1].parse::<u8>()? * 127;
|
||||
conn_out.send(&[0xB0, 64, pedal]).unwrap();
|
||||
}
|
||||
},
|
||||
Err(ref e) if e.kind() == std::io::ErrorKind::TimedOut => (),
|
||||
Err(e) => {
|
||||
if e.kind() == std::io::ErrorKind::BrokenPipe {
|
||||
println!("Connection closed.");
|
||||
exit(0);
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
pretty_env_logger::init();
|
||||
start().expect("Error: Start failed.");
|
||||
}
|
||||
Reference in New Issue
Block a user