midi-io 0.1.1

Stream and send strictly-typed MIDI messages
Documentation
use midi_io::Client;
use midi_io::Decoded;

#[tokio::main]
async fn main() -> Result<(), midi_io::Error> {
    let client = Client::new("receive").await?;
    let sources = client.sources().await?;

    if sources.is_empty() {
        eprintln!("No MIDI sources found.");
        return Ok(());
    }

    let source = sources
        .iter()
        .find(|p| p.name().contains("IAC"))
        .or_else(|| sources.first())
        .expect("non-empty, checked above");

    eprintln!("Listening on: {}", source.name());

    let conn = client.connect_source(source).await?;
    let mut events = conn.into_events();

    while let Some(timed) = events.recv().await {
        match &timed.payload {
            Ok(Decoded::Message(m)) => println!("{} {}", timed.timestamp.elapsed().as_millis(), m),
            Ok(Decoded::SysEx(s)) => println!(
                "{} SysEx({} bytes)",
                timed.timestamp.elapsed().as_millis(),
                s.bytes().len()
            ),
            Err(e) => eprintln!("Error: {}", e),
        }
    }

    Ok(())
}