Skip to content

Commit 7aff9e6

Browse files
committed
Initial version
0 parents  commit 7aff9e6

File tree

4 files changed

+117
-0
lines changed

4 files changed

+117
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*~
2+
target

Cargo.toml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[package]
2+
name = "midihid"
3+
version = "0.1.0"
4+
edition = "2021"
5+
authors = ["Erkki Seppälä <[email protected]>"]
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
anyhow = { version = "1.0.65", features = [] }
11+
clap = { version = "4.0.10", features = ["derive", "wrap_help", "unicode"] }
12+
jack = "0.8.0" # Real time audio and midi with JACK.
13+
thiserror = "1.0.22"

src/error.rs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use std::io;
2+
use thiserror::Error;
3+
4+
#[derive(Error, Debug)]
5+
pub(crate) enum Error {
6+
#[error(transparent)]
7+
IOError(#[from] io::Error),
8+
}

src/main.rs

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
mod error;
2+
3+
use std::sync::{Arc, Mutex};
4+
use std::{thread, time};
5+
6+
struct State {}
7+
8+
fn init_midi() -> (
9+
jack::Client,
10+
Arc<Mutex<jack::Port<jack::MidiIn>>>,
11+
Arc<Mutex<State>>,
12+
) {
13+
let (client, _status) =
14+
jack::Client::new("midihid", jack::ClientOptions::NO_START_SERVER).unwrap();
15+
16+
let midi_receiver = client
17+
.register_port("keyboard", jack::MidiIn::default())
18+
.unwrap();
19+
20+
let state = State {};
21+
(
22+
client,
23+
Arc::new(Mutex::new(midi_receiver)),
24+
Arc::new(Mutex::new(state)),
25+
)
26+
}
27+
28+
fn main() {
29+
let (client, midi_receiver, _state) = init_midi();
30+
31+
let jack_callback = {
32+
//let state = Arc::clone(&state);
33+
let midi_receiver = Arc::clone(&midi_receiver);
34+
move |_: &jack::Client, ps: &jack::ProcessScope| -> jack::Control {
35+
let midi_receiver = Arc::clone(&midi_receiver);
36+
let midi = midi_receiver.lock().expect("Cannot lock midi");
37+
for event in midi.iter(ps) {
38+
match event.bytes {
39+
[248] => (),
40+
_ => println!("{event:?}"),
41+
}
42+
}
43+
jack::Control::Continue
44+
}
45+
};
46+
47+
let port_names = client.ports(None, None, jack::PortFlags::IS_OUTPUT);
48+
49+
let mut connected = false;
50+
for port_name in port_names {
51+
if let Some(port) = client.port_by_name(&port_name) {
52+
let matches = matches!(
53+
port.aliases()
54+
.expect("aiee")
55+
.iter()
56+
.filter(|&x| x.as_str() == "Novation SL MkIII:Novation SL MkIII MIDI 1")
57+
.next(),
58+
Some(_)
59+
);
60+
if matches {
61+
let midi_receiver = Arc::clone(&midi_receiver);
62+
let midi_receiver = midi_receiver.lock().expect("cannot lock midi_receiver");
63+
client
64+
.connect_ports(&port, &midi_receiver)
65+
.expect("cannot connect ports");
66+
println!("port: {port:?}");
67+
connected = true;
68+
break;
69+
}
70+
}
71+
}
72+
73+
if !connected {
74+
println!("Did not find port to connect :(");
75+
}
76+
77+
if true {
78+
let _active_client = client
79+
.activate_async((), jack::ClosureProcessHandler::new(jack_callback))
80+
.expect("Failed to activate client");
81+
82+
// measurement_fin_rx
83+
// .recv()
84+
// .expect("Failed to received measurement finish response")?;
85+
86+
loop {
87+
thread::sleep(time::Duration::from_secs(10));
88+
}
89+
90+
// active_client
91+
// .deactivate()
92+
// .expect("Failed to deactivate Jack session");
93+
}
94+
}

0 commit comments

Comments
 (0)