From 094d5dd451792f39990a00d8f4b632d25c2631e3 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 15 May 2025 00:01:26 +0300 Subject: [PATCH] wip: reimplement arranger because i'm sick of that shit --- config/config_arranger.edn | 17 +++- crates/app/src/view.rs | 107 +++++++++++++++++++- crates/cli/tek.rs | 2 +- crates/device/src/arranger.rs | 2 +- crates/device/src/arranger/arranger_view.rs | 2 +- deps/tengri | 2 +- 6 files changed, 120 insertions(+), 12 deletions(-) diff --git a/config/config_arranger.edn b/config/config_arranger.edn index fcfdf972..7d61e025 100644 --- a/config/config_arranger.edn +++ b/config/config_arranger.edn @@ -18,8 +18,15 @@ (layer "./keys_global.edn")) (view (bsp/a :view-dialog - (bsp/e - (fill/y (align/n (bsp/s :view-status-v (bsp/s - :view-audio-ports-status - (bsp/n :view-editor-status :view-pool))))) - :view-arranger))) + (bsp/s + (fixed/y 8 (bsp/e + (fixed/x 20 (fill/y (align/n (bsp/s :view-status-v + (bsp/s :view-audio-ports-status :view-editor-status))))) + (fill/xy (align/n (bsp/s :view-arranger-track-names + (bsp/s :view-arranger-track-outputs + (bsp/s :view-arranger-track-devices :view-arranger-track-inputs))))))) + (bsp/w + (fixed/x 20 :view-pool) + (bsp/e + (fixed/x 20 (fill/xy (align/n :view-arranger-scene-names))) + (fill/xy :view-arranger)))))) diff --git a/crates/app/src/view.rs b/crates/app/src/view.rs index 1d72d059..09a3518d 100644 --- a/crates/app/src/view.rs +++ b/crates/app/src/view.rs @@ -19,7 +19,7 @@ impl App { let cache = self.view_cache.read().unwrap(); let theme = self.color; let playing = self.clock().is_rolling(); - Fixed::xy(20, 6, col!( + Tui::bg(theme.darkest.rgb, Fixed::xy(20, 6, col!( Fill::x(Align::w(Bsp::e( Align::w(Tui::bg(if playing { Rgb(0, 128, 0) } else { Rgb(128, 64, 0) }, Either::new(false, // TODO @@ -42,7 +42,7 @@ impl App { Fill::x(Align::w(FieldH(theme, "SR ", cache.sr.view.clone()))), Fill::x(Align::w(FieldH(theme, "Buf", cache.buf.view.clone()))), Fill::x(Align::w(FieldH(theme, "Lat", cache.lat.view.clone()))), - )) + ))) } pub fn view_status (&self) -> impl Content + use<'_> { self.update_clock(); @@ -92,9 +92,110 @@ impl App { pub fn view_arranger (&self) -> impl Content + use<'_> { ArrangerView::new(&self.project, self.editor.as_ref()) } + pub fn view_arranger_track_names (&self) -> impl Content + use<'_> { + let mut max_outputs = 0u16; + for track in self.project.tracks.iter() { + max_outputs = max_outputs.max(track.sequencer.midi_outs.len() as u16); + } + Bsp::w( + Fixed::x(20, Tui::bg(self.color.darkest.rgb, + col!(Tui::bold(true, "[t]rack"), "[T] Add"))), + Fixed::y(max_outputs + 1, Tui::bg(self.color.darker.rgb, Align::w(Fill::x(Map::new( + ||self.project.tracks_with_sizes(&self.project.selection, None) + .skip(self.project.track_scroll), + move|(index, track, x1, x2): (usize, &Track, usize, usize), _| + Push::x(x2 as u16, Fixed::xy(track.width as u16, max_outputs + 1, + Tui::bg(track.color.dark.rgb, Align::nw(Bsp::s( + Tui::fg(Rgb(255, 255, 255), Tui::bold(true, format!("{}", track.name))), + format!("{index} {x1} {x2}")))))))))))) + } + pub fn view_arranger_track_outputs <'a> (&'a self) -> impl Content + use<'a> { + let mut max_outputs = 0u16; + for track in self.project.tracks.iter() { + max_outputs = max_outputs.max(track.sequencer.midi_outs.len() as u16); + } + Bsp::w( + Fixed::x(20, Tui::bg(self.color.darkest.rgb, + col!(Tui::bold(true, "[o]utput"), "[O] Add"))), + Fixed::y(max_outputs + 1, Tui::bg(self.color.darker.rgb, Align::w(Fill::x(Map::new( + ||self.project.tracks_with_sizes(&self.project.selection, None) + .skip(self.project.track_scroll), + move|(index, track, x1, x2): (usize, &'a Track, usize, usize), _| + Push::x(x2 as u16, Tui::bg(track.color.dark.rgb, Fixed::xy( + track.width as u16, + max_outputs + 1, + Align::nw(Bsp::s( + format!("[mut] [sol]"), + Map::south(1, ||track.sequencer.midi_outs.iter(), + |port, index|Tui::fg(Rgb(255, 255, 255), + format!("{index}: {}", port.name())))))))))))))) + } + pub fn view_arranger_track_inputs <'a> (&'a self) -> impl Content + use<'a> { + let mut max_inputs = 0u16; + for track in self.project.tracks.iter() { + max_inputs = max_inputs.max(track.sequencer.midi_ins.len() as u16); + } + Bsp::w( + Fixed::x(20, Tui::bg(self.color.darkest.rgb, + col!(Tui::bold(true, "[i]nputs"), "[I] Add"))), + Fixed::y(max_inputs + 1, Tui::bg(self.color.darker.rgb, Align::w(Fill::x(Map::new( + ||self.project.tracks_with_sizes(&self.project.selection, None) + .skip(self.project.track_scroll), + move|(index, track, x1, x2): (usize, &'a Track, usize, usize), _| + Push::x(x2 as u16, Fixed::xy(track.width as u16, max_inputs + 1, + Tui::bg(track.color.dark.rgb, Align::nw(Bsp::s( + format!("[rec] [mon]"), + Map::south(1, ||track.sequencer.midi_ins.iter(), + |port, index|Tui::fg(Rgb(255, 255, 255), + format!("{index}: {}", port.name())))))))))))))) + } + pub fn view_arranger_track_devices <'a> (&'a self) -> impl Content + use<'a> { + let mut max_devices = 2u16; + for track in self.project.tracks.iter() { + max_devices = max_devices.max(track.devices.len() as u16); + } + Bsp::w( + Fixed::x(20, Tui::bg(self.color.darkest.rgb, + col!(Tui::bold(true, "[d]evice"), "[D] Add"))), + Fixed::y(max_devices, Tui::bg(self.color.darker.rgb, Align::w(Fill::x(Map::new( + ||self.project.tracks_with_sizes(&self.project.selection, None) + .skip(self.project.track_scroll), + move|(index, track, x1, x2): (usize, &'a Track, usize, usize), _| + Push::x(x2 as u16, Fixed::xy(track.width as u16, max_devices + 1, + Tui::bg(track.color.dark.rgb, Align::nw(Map::south(1, move||0..max_devices, + |_, index|format!("{index}: {}", "--------")))))))))))) + } + pub fn view_arranger_track_scenes <'a> (&'a self) -> impl Content + use<'a> { + let mut max_devices = 0u16; + for track in self.project.tracks.iter() { + max_devices = max_devices.max(track.devices.len() as u16); + } + Bsp::w( + Fixed::x(20, Tui::bg(self.color.darkest.rgb, + col!(Tui::bold(true, "Devices"), "[d] Select", "[D] Add"))), + Fixed::y(max_devices + 1, Tui::bg(self.color.darker.rgb, Align::w(Fill::x(Map::new( + ||self.project.tracks_with_sizes(&self.project.selection, None) + .skip(self.project.track_scroll), + move|(index, track, x1, x2): (usize, &'a Track, usize, usize), _| + Push::x(x2 as u16, Fixed::xy(track.width as u16, max_devices + 1, + Align::nw(Map::south(1, ||track.devices.iter(), + |device, index|format!("{index}: {}", device.name()))))))))))) + } + pub fn view_arranger_scene_names <'a> (&'a self) -> impl Content + use<'a> { + Fixed::y(self.project.scenes.len() as u16 * 2, + Tui::bg(self.color.darker.rgb, + Align::w(Fill::x(Map::new( + ||self.project.scenes.iter().skip(self.project.scene_scroll), + move|scene: &Scene, index| + Push::y(index as u16 * 2u16, Fixed::xy(20, 2, + Tui::bg(scene.color.dark.rgb, Align::nw(Bsp::e( + format!(" {index:2} "), + Tui::fg(Rgb(255, 255, 255), + Tui::bold(true, format!("{}", scene.name))))))))))))) + } pub fn view_pool (&self) -> impl Content + use<'_> { Fixed::x(20, Bsp::s( - Fill::x(Align::w(FieldH(self.color, "MIDI clip pool:", ""))), + Fill::x(Align::w(FieldH(self.color, "Clip pool:", ""))), Fill::y(Align::n(Tui::bg(Rgb(0, 0, 0), PoolView(&self.project.pool)))), )) } diff --git a/crates/cli/tek.rs b/crates/cli/tek.rs index 1d407373..97a7f499 100644 --- a/crates/cli/tek.rs +++ b/crates/cli/tek.rs @@ -60,7 +60,7 @@ pub enum LaunchMode { /// Number of tracks #[arg(short = 'x', long, default_value_t = 4)] tracks: usize, /// Width of tracks - #[arg(short = 'w', long, default_value_t = 12)] track_width: usize, + #[arg(short = 'w', long, default_value_t = 14)] track_width: usize, }, /// TODO: A MIDI-controlled audio mixer Mixer, diff --git a/crates/device/src/arranger.rs b/crates/device/src/arranger.rs index 2939b23e..38f5b313 100644 --- a/crates/device/src/arranger.rs +++ b/crates/device/src/arranger.rs @@ -3,7 +3,7 @@ use crate::*; /// Define a type alias for iterators of sized items (columns). macro_rules! def_sizes_iter { ($Type:ident => $($Item:ty),+) => { - pub(crate) trait $Type<'a> = + pub trait $Type<'a> = Iterator + Send + Sync + 'a; } } diff --git a/crates/device/src/arranger/arranger_view.rs b/crates/device/src/arranger/arranger_view.rs index 64eb5065..cbd3a4b1 100644 --- a/crates/device/src/arranger/arranger_view.rs +++ b/crates/device/src/arranger/arranger_view.rs @@ -24,7 +24,7 @@ impl<'a> ArrangerView<'a> { ) -> Self { let is_editing = editor.is_some(); let h_tracks_area = 5; - let h_scenes_area = (arrangement.height() as u16).saturating_sub(50); + let h_scenes_area = (arrangement.height() as u16).saturating_sub(20); let h_scenes = arrangement.h_scenes(is_editing); Self { arrangement, diff --git a/deps/tengri b/deps/tengri index f7306de5..c954965a 160000 --- a/deps/tengri +++ b/deps/tengri @@ -1 +1 @@ -Subproject commit f7306de55faea42bb1531955a92220fd48d9aadb +Subproject commit c954965ae125136286291e5f0d4532edf98f46ad