]> git.huck.website - cellseq.git/commitdiff
added: alsa connection to midi
authorHuck Boles <huck@huck.website>
Mon, 3 Jul 2023 01:27:34 +0000 (20:27 -0500)
committerHuck Boles <huck@huck.website>
Mon, 3 Jul 2023 01:27:34 +0000 (20:27 -0500)
Cargo.lock
Cargo.toml
src/main.rs
src/music.rs

index c1d4b224ee49d8bc2617881bd35f6c76f945aa62..42b2a4882ec8fa6034fc0f99ff93a7352d71c3bc 100644 (file)
@@ -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"
index 8f6ab030f2e959e06e47bc8cb422292dbbcb1a2d..d87a279481ad14b663e5fb2bd11940b5702bd68b 100644 (file)
@@ -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"
index 3db3f9f75c839f0c8782f94fdc897ed5a3af980f..4156b581864745aceae96f5d800321b3eee7c0b1 100644 (file)
@@ -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::<u8>(256);
-
+    let (midi_snd, mut midi_rcv) = channel::<u8>(256);
     let midi = MidiLink::new(midi_snd);
 
+    let midi_sink = Rawmidi::new("virtual", Direction::Playback, false)?;
+
+    let midi_loop: JoinHandle<Result<()>> = 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(())
 }
index d1ffe54ed40b9cd05ec1860ac5d19267691024ef..dfa8e7ada69b155a10b422b39ff41fd4ab120a1e 100644 (file)
@@ -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<Root> 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}")
     }