From e328d33e59d7d2ad759960b41193a46777460d8a Mon Sep 17 00:00:00 2001 From: Huck Boles Date: Sun, 2 Jul 2023 20:27:34 -0500 Subject: [PATCH] added: alsa connection to midi --- Cargo.lock | 53 +++++++++++++++++++++++++++++++++++++--------------- Cargo.toml | 1 + src/main.rs | 23 ++++++++++++++++++++--- src/music.rs | 24 +++++++++++++++--------- 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1d4b22..42b2a48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,6 +44,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "alsa" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8512c9117059663fb5606788fbca3619e2a91dac0e3fe516242eab1fa6be5e44" +dependencies = [ + "alsa-sys", + "bitflags", + "libc", + "nix 0.24.3", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -166,7 +188,7 @@ checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -205,6 +227,7 @@ checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" name = "cellseq" version = "0.1.0" dependencies = [ + "alsa", "array2d", "eyre", "iced", @@ -691,7 +714,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -785,7 +808,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -1756,7 +1779,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -1770,9 +1793,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -2005,7 +2028,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -2160,9 +2183,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.22" +version = "2.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" dependencies = [ "proc-macro2", "quote", @@ -2195,7 +2218,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -2251,7 +2274,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -2360,7 +2383,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", "wasm-bindgen-shared", ] @@ -2394,7 +2417,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2941,6 +2964,6 @@ checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" [[package]] name = "xml-rs" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52839dc911083a8ef63efa4d039d1f58b5e409f923e44c80828f206f66e5541c" +checksum = "5a56c84a8ccd4258aed21c92f70c0f6dea75356b6892ae27c24139da456f9336" diff --git a/Cargo.toml b/Cargo.toml index 8f6ab03..d87a279 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,4 @@ array2d = "0.3.0" iced = { version = "0.9", features = ["canvas", "tokio", "debug"] } itertools = "0.10" rustc-hash = "1.1" +alsa = "0.7" diff --git a/src/main.rs b/src/main.rs index 3db3f9f..4156b58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,30 @@ +use std::{io::Write, thread::JoinHandle}; + +use alsa::{ + rawmidi::{Rawmidi, IO}, + Direction, +}; use cellseq::*; use iced::{window, Application, Settings}; -use eyre::Result; +use eyre::{eyre, Result}; use tokio::sync::mpsc::channel; pub fn main() -> Result<()> { - let (midi_snd, _midi_rcv) = channel::(256); - + let (midi_snd, mut midi_rcv) = channel::(256); let midi = MidiLink::new(midi_snd); + let midi_sink = Rawmidi::new("virtual", Direction::Playback, false)?; + + let midi_loop: JoinHandle> = std::thread::spawn(move || { + let mut midi_io = midi_sink.io(); + while let Some(byte) = midi_rcv.blocking_recv() { + midi_io.write_all(&[byte])?; + } + Ok(()) + }); + // running the graphics window CellSeq::run(Settings { antialiasing: true, @@ -21,5 +36,7 @@ pub fn main() -> Result<()> { ..Settings::default() })?; + midi_loop.join().map_err(|_| eyre!("join failure"))??; + Ok(()) } diff --git a/src/music.rs b/src/music.rs index d1ffe54..dfa8e7a 100644 --- a/src/music.rs +++ b/src/music.rs @@ -107,16 +107,22 @@ impl Root { } } +impl Display for Root { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}{}", self.note, self.accidental) + } +} + impl From for u8 { fn from(val: Root) -> Self { let n = match val.note { RootNote::A => 21, - RootNote::B => 22, - RootNote::C => 23, - RootNote::D => 24, - RootNote::E => 25, - RootNote::F => 26, - RootNote::G => 27, + RootNote::B => 23, + RootNote::C => 24, + RootNote::D => 26, + RootNote::E => 28, + RootNote::F => 29, + RootNote::G => 31, }; match val.accidental { @@ -178,9 +184,9 @@ pub enum Accidental { impl Display for Accidental { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let str = match self { - Accidental::Natural => "", - Accidental::Sharp => "#", - Accidental::Flat => "b", + Accidental::Natural => "♮", + Accidental::Sharp => "♯", + Accidental::Flat => "♭", }; write!(f, "{str}") } -- 2.44.2