diff --git a/Justfile b/Justfile index a6ff44fe..4223d64b 100644 --- a/Justfile +++ b/Justfile @@ -63,19 +63,32 @@ groovebox: groovebox-release: reset cargo run --release --bin tek_groovebox +groovebox-release-ext: + reset + cargo run --release --bin tek_groovebox -- -n tek \ + -i "Midi-Bridge:nanoKEY Studio 1:(capture_0) nanoKEY Studio nanoKEY Studio _" \ + -o "Midi-Bridge:Komplete Audio 6 0:(playback_0) Komplete Audio 6 MIDI 1" \ + -l "Komplete Audio 6 Pro:capture_AUX1" \ + -r "Komplete Audio 6 Pro:capture_AUX1" \ + -L "Komplete Audio 6 Pro:playback_AUX1" \ + -R "Komplete Audio 6 Pro:playback_AUX1" sequencer: reset cargo run --bin tek_sequencer sequencer-ext: reset - cargo run --bin tek_sequencer -- -i "Midi-Bridge:nanoKEY Studio 2:(capture_0) nanoKEY Studio nanoKEY Studio _" -o "Midi-Bridge:Komplete Audio 6 1:(playback_0) Komplete Audio 6 MIDI 1" + cargo run --bin tek_sequencer -- \ + -i "Midi-Bridge:nanoKEY Studio 1:(capture_0) nanoKEY Studio nanoKEY Studio _" \ + -o "Midi-Bridge:Komplete Audio 6 0:(playback_0) Komplete Audio 6 MIDI 1" sequencer-release: reset cargo run --release --bin tek_sequencer sequencer-release-ext: reset - cargo run --release --bin tek_sequencer -- -i "Midi-Bridge:nanoKEY Studio 2:(capture_0) nanoKEY Studio nanoKEY Studio _" -o "Midi-Bridge:Komplete Audio 6 1:(playback_0) Komplete Audio 6 MIDI 1" + cargo run --release --bin tek_sequencer -- \ + -i "Midi-Bridge:nanoKEY Studio 1:(capture_0) nanoKEY Studio nanoKEY Studio _" \ + -o "Midi-Bridge:Komplete Audio 6 0:(playback_0) Komplete Audio 6 MIDI 1" mixer: reset diff --git a/crates/cli/src/cli_groovebox.rs b/crates/cli/src/cli_groovebox.rs index 04ef82f1..e175d59e 100644 --- a/crates/cli/src/cli_groovebox.rs +++ b/crates/cli/src/cli_groovebox.rs @@ -6,31 +6,46 @@ pub struct GrooveboxCli { /// Name of JACK client #[arg(short, long)] name: Option, - /// Whether to include a transport toolbar (default: true) #[arg(short, long, default_value_t = true)] transport: bool, - - /// MIDI outs to connect to (multiple accepted) + /// MIDI outs to connect to MIDI input #[arg(short='i', long)] midi_from: Vec, - - /// MIDI ins to connect to (multiple accepted) + /// MIDI ins to connect from MIDI output #[arg(short='o', long)] midi_to: Vec, - - /// Audio ins to connect to (multiple accepted) - #[arg(short='I', long)] - audio_from: Vec, - - /// Audio outs to connect to (multiple accepted) - #[arg(short='O', long)] - audio_to: Vec, + /// Audio outs to connect to left input + #[arg(short='l', long)] + l_from: Vec, + /// Audio outs to connect to right input + #[arg(short='r', long)] + r_from: Vec, + /// Audio ins to connect from left output + #[arg(short='L', long)] + l_to: Vec, + /// Audio ins to connect from right output + #[arg(short='R', long)] + r_to: Vec, } impl GrooveboxCli { fn run (&self) -> Usually<()> { - Tui::run(JackClient::new("tek_groovebox")? - .activate_with(|jack|tek::GrooveboxTui::try_from(jack))?)?; + Tui::run(JackClient::new("tek_groovebox")?.activate_with(|jack|{ + let app = tek::GrooveboxTui::try_from(jack)?; + let jack = jack.read().unwrap(); + + jack.client().connect_ports(&app.player.midi_outs[0], &app.sampler.midi_in)?; + + connect_from(&jack, &app.player.midi_ins[0], &self.midi_from)?; + connect_to(&jack, &app.player.midi_outs[0], &self.midi_to)?; + + connect_audio_from(&jack, &app.sampler.audio_ins[0], &self.l_from)?; + connect_audio_from(&jack, &app.sampler.audio_ins[1], &self.r_from)?; + connect_audio_to(&jack, &app.sampler.audio_outs[0], &self.l_to)?; + connect_audio_to(&jack, &app.sampler.audio_outs[1], &self.r_to)?; + + Ok(app) + })?)?; Ok(()) } } diff --git a/crates/cli/src/cli_sequencer.rs b/crates/cli/src/cli_sequencer.rs index 247282f7..e8474507 100644 --- a/crates/cli/src/cli_sequencer.rs +++ b/crates/cli/src/cli_sequencer.rs @@ -11,15 +11,12 @@ pub struct SequencerCli { /// Name of JACK client #[arg(short, long)] name: Option, - /// Whether to include a transport toolbar (default: true) #[arg(short, long, default_value_t = true)] transport: bool, - /// MIDI outs to connect to (multiple instances accepted) #[arg(short='i', long)] midi_from: Vec, - /// MIDI ins to connect to (multiple instances accepted) #[arg(short='o', long)] midi_to: Vec, @@ -33,7 +30,7 @@ impl SequencerCli { let jack = jack.read().unwrap(); let midi_in = jack.register_port("i", MidiIn::default())?; let midi_out = jack.register_port("o", MidiOut::default())?; - connect_from(&jack, &midi_in, &self.midi_from)?; + connect_from(&jack, &midi_in, &self.midi_from)?; connect_to(&jack, &midi_out, &self.midi_to)?; app.player.midi_ins.push(midi_in); app.player.midi_outs.push(midi_out); diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index e2d6822e..538ecfe7 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -25,3 +25,27 @@ fn connect_to (jack: &JackClient, output: &Port, ports: &[String]) -> U } Ok(()) } + +#[allow(unused)] +fn connect_audio_from (jack: &JackClient, input: &Port, ports: &[String]) -> Usually<()> { + for port in ports.iter() { + if let Some(port) = jack.port_by_name(port).as_ref() { + jack.client().connect_ports(port, input)?; + } else { + panic!("Missing MIDI output: {port}. Use jack_lsp to list all port names."); + } + } + Ok(()) +} + +#[allow(unused)] +fn connect_audio_to (jack: &JackClient, output: &Port, ports: &[String]) -> Usually<()> { + for port in ports.iter() { + if let Some(port) = jack.port_by_name(port).as_ref() { + jack.client().connect_ports(output, port)?; + } else { + panic!("Missing MIDI input: {port}. Use jack_lsp to list all port names."); + } + } + Ok(()) +}