diff --git a/crates/tek/src/cli/cli_arranger.rs b/crates/tek/src/cli/cli_arranger.rs index 3b5bf339..4470c606 100644 --- a/crates/tek/src/cli/cli_arranger.rs +++ b/crates/tek/src/cli/cli_arranger.rs @@ -32,27 +32,37 @@ impl ArrangerCli { Tui::run(JackClient::new(client_name.as_str())?.activate_with(|jack|{ let mut app = ArrangerTui::try_from(jack)?; app.color = ItemPalette::random(); - let track_color_1 = ItemColor::random(); - let track_color_2 = ItemColor::random(); - for i in 0..self.tracks { - let track = app.track_add(None, Some( - track_color_1.mix(track_color_2, i as f32 / self.tracks as f32).into() - ))?; - track.width = 8; - } - let scene_color_1 = ItemColor::random(); - let scene_color_2 = ItemColor::random(); - for i in 0..self.scenes { - let _scene = app.scene_add(None, Some( - scene_color_1.mix(scene_color_2, i as f32 / self.scenes as f32).into() - ))?; - } + add_tracks(&mut app, self.tracks)?; + add_scenes(&mut app, self.scenes)?; Ok(app) })?)?; Ok(()) } } +fn add_tracks (app: &mut ArrangerTui, n: usize) -> Usually<()> { + let track_color_1 = ItemColor::random(); + let track_color_2 = ItemColor::random(); + for i in 0..n { + let track = app.track_add(None, Some( + track_color_1.mix(track_color_2, i as f32 / n as f32).into() + ))?; + track.width = 8; + } + Ok(()) +} + +fn add_scenes (app: &mut ArrangerTui, n: usize) -> Usually<()> { + let scene_color_1 = ItemColor::random(); + let scene_color_2 = ItemColor::random(); + for i in 0..n { + let _scene = app.scene_add(None, Some( + scene_color_1.mix(scene_color_2, i as f32 / n as f32).into() + ))?; + } + Ok(()) +} + #[test] fn verify_arranger_cli () { use clap::CommandFactory; ArrangerCli::command().debug_assert(); diff --git a/crates/tek/src/cli/cli_sequencer.rs b/crates/tek/src/cli/cli_sequencer.rs index 8ca476ab..52d935d7 100644 --- a/crates/tek/src/cli/cli_sequencer.rs +++ b/crates/tek/src/cli/cli_sequencer.rs @@ -32,25 +32,10 @@ impl SequencerCli { let jack = jack.read().unwrap(); let midi_in = jack.register_port("in", MidiIn::default())?; let midi_out = jack.register_port("out", MidiOut::default())?; - for port in self.midi_from.iter() { - if let Some(port) = jack.port_by_name(&port) { - jack.client().connect_ports(&port, &midi_in)?; - } else { - panic!("Missing MIDI output: {port}"); - } - } - for port in self.midi_to.iter() { - if let Some(port) = jack.port_by_name(&port) { - jack.client().connect_ports(&midi_out, &port)?; - } else { - panic!("Missing MIDI output: {port}"); - } - } + 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); - if let Some(_) = self.name.as_ref() { - // TODO: sequencer.name = Arc::new(RwLock::new(name.clone())); - } if let Some(_) = self.length { // TODO: if let Some(phrase) = sequencer.phrase.as_mut() { //phrase.write().unwrap().length = length; @@ -62,6 +47,28 @@ impl SequencerCli { } } +fn connect_from (jack: &JackClient, input: &Port, ports: &[String]) -> Usually<()> { + for port in ports.iter() { + if let Some(port) = jack.port_by_name(&port) { + jack.client().connect_ports(&port, &input)?; + } else { + panic!("Missing MIDI output: {port}"); + } + } + Ok(()) +} + +fn connect_to (jack: &JackClient, output: &Port, ports: &[String]) -> Usually<()> { + for port in ports.iter() { + if let Some(port) = jack.port_by_name(&port) { + jack.client().connect_ports(&output, &port)?; + } else { + panic!("Missing MIDI output: {port}"); + } + } + Ok(()) +} + #[test] fn verify_sequencer_cli () { use clap::CommandFactory; SequencerCli::command().debug_assert(); diff --git a/crates/tek/src/tui/arranger_mode_v/v_clips.rs b/crates/tek/src/tui/arranger_mode_v/v_clips.rs index 0c8d073b..64d785c5 100644 --- a/crates/tek/src/tui/arranger_mode_v/v_clips.rs +++ b/crates/tek/src/tui/arranger_mode_v/v_clips.rs @@ -28,8 +28,8 @@ impl<'a> ArrangerVClips<'a> { let height = 1.max((pulses / PPQ) as u16); let playing = scene.is_playing(tracks); Fixed::h(height, row!([ - if playing { "▶ " } else { " " }, - Tui::bold(true, scene.name.read().unwrap().as_str()), + Tui::bg(scene.color.base.rgb, if playing { "▶ " } else { " " }), + Tui::fg_bg(scene.color.lightest.rgb, scene.color.base.rgb, Tui::grow_x(1, Tui::bold(true, scene.name.read().unwrap().as_str()))), row!((index, track, x1, x2) in ArrangerTrack::with_widths(tracks) => { Self::format_clip(scene, index, track, (x2 - x1) as u16, height) })]) @@ -51,9 +51,9 @@ impl<'a> ArrangerVClips<'a> { bg = color.light.rgb } }; - add(&Tui::push_x(1, Tui::bg(bg, + add(&Tui::bg(bg, Tui::push_x(1, Fixed::w(w as u16, &name.as_str()[0..max_w]))) - ))?; + )?; } //add(&Background(bg)) Ok(()) diff --git a/crates/tek/src/tui/arranger_mode_v/v_io.rs b/crates/tek/src/tui/arranger_mode_v/v_io.rs index c55d8c42..1577f97b 100644 --- a/crates/tek/src/tui/arranger_mode_v/v_io.rs +++ b/crates/tek/src/tui/arranger_mode_v/v_io.rs @@ -11,7 +11,7 @@ from!(<'a>|args: &'a ArrangerTui|ArrangerVIns<'a> = Self { tracks: &args.tracks, }); -render!(|self: ArrangerVIns<'a>|""); +render!(|self: ArrangerVIns<'a>|()); pub struct ArrangerVOuts<'a> { size: &'a Measure, @@ -23,4 +23,4 @@ from!(<'a>|args: &'a ArrangerTui|ArrangerVOuts<'a> = Self { tracks: &args.tracks, }); -render!(|self: ArrangerVOuts<'a>|""); +render!(|self: ArrangerVOuts<'a>|());