diff --git a/cli/tek.rs b/cli/tek.rs index 982da3b9..3458e4b8 100644 --- a/cli/tek.rs +++ b/cli/tek.rs @@ -43,16 +43,16 @@ pub enum TekMode { Sequencer, /// A MIDI-controlled audio sampler. Sampler, - /// Sequencer and sampler together. + /// Sequencer and sampler together.12 Groovebox, /// Multi-track MIDI sequencer. Arranger { + /// Number of scenes + #[arg(short = 'y', long, default_value_t = 12)] scenes: usize, /// Number of tracks - #[arg(short = 'x', long, default_value_t = 4)] tracks: usize, + #[arg(short = 'x', long, default_value_t = 8)] tracks: usize, /// Width of tracks #[arg(short = 'w', long, default_value_t = 8)] track_width: usize, - /// Number of scenes - #[arg(short = 'y', long, default_value_t = 16)] scenes: usize, }, /// TODO: A MIDI-controlled audio mixer Mixer, @@ -177,7 +177,7 @@ pub fn main () -> Usually<()> { clock, pool: (&clip).into(), editor: (&clip).into(), - selected: ArrangerSelection::Scene(4), + selected: ArrangerSelection::Clip(0, 0), scenes: vec![], tracks: vec![], splits: [12, 20], diff --git a/tek/src/arranger.rs b/tek/src/arranger.rs index 384e7cec..d3ea33db 100644 --- a/tek/src/arranger.rs +++ b/tek/src/arranger.rs @@ -111,9 +111,14 @@ pub(crate) const HEADER_H: u16 = 0; // 5 pub(crate) const SCENES_W_OFFSET: u16 = 0; render!(TuiOut: (self: Arranger) => { let scenes_w = 16; + let tracks_w = self.tracks_with_widths().last().unwrap().3 as u16; let row = move|h, header, cells|Fixed::y(h, Bsp::e( Fixed::x(scenes_w, header), - Fixed::y(h, Fill::x(Align::x(cells))) + Fill::x(Align::c(Fixed::xy(tracks_w, h, cells))) + )); + let big = move|h, header, cells|Fixed::y(h, Bsp::e( + Fill::y(Align::c(Fixed::x(scenes_w, header))), + Fill::x(Align::c(Fixed::xy(tracks_w, h, cells))) )); //let row = move|h, header, cells|Align::w(Bsp::e( //Align::w(Fixed::xy(scenes_w, h, header)), @@ -126,10 +131,10 @@ render!(TuiOut: (self: Arranger) => { let outputs = |x|Bsp::s(row(2, self.output_row_header(), self.output_row_cells()), Fill::y(x)); let playing = |x|Bsp::s(row(2, self.elapsed_row_header(), self.elapsed_row_cells()), Fill::y(x)); let next = |x|Bsp::s(row(2, self.next_row_header(), self.next_row_cells()), Fill::y(x)); - let tracks = |x|Bsp::s(row(3, self.track_row_header(), self.track_row_cells()), Fill::y(x)); - let scenes = |x|Bsp::s(row(h.saturating_sub(13), self.scene_row_headers(), self.scene_row_cells()), x); + let tracks = |x|Bsp::s(row(3, self.track_row_header(), self.track_row_cells()), Fill::y(Align::c(x))); + let scenes = |x|Bsp::s(big(h.saturating_sub(13), self.scene_row_headers(), Tui::bg(Color::Green, self.scene_row_cells())), x); let inputs = |x|Bsp::n(row(2, self.input_row_header(), self.input_row_cells()), Fill::y(x)); - self.size.of(toolbar(pool(editing(inputs(outputs(playing(next(tracks(scenes(Fill::xy(""))))))))))) + self.size.of(toolbar(pool(Fill::xy(Align::c(editing(inputs(outputs(playing(next(tracks(scenes(Fill::xy(""))))))))))))) //let enclosed = |x|Outer(Style::default().fg(Color::Rgb(72,72,72))).enclose(x); //.max(SCENES_W_OFFSET + ArrangerScene::longest_name(&self.scenes) as u16); //Bsp::s(arrrrrr, enclosed(&self.editor)) @@ -182,7 +187,7 @@ impl Arranger { } fn output_row_cells <'a> (&'a self) -> BoxThunk<'a, TuiOut> { //let scenes_w = 16;//.max(SCENES_W_OFFSET + ArrangerScene::longest_name(&self.scenes) as u16); - (move||Fixed::y(2, Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { + (move||Align::x(Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { let w = (x2 - x1) as u16; let color: ItemPalette = track.color().dark.into(); let cell = Bsp::s(format!(" M S "), phat_hi(color.dark.rgb, color.darker.rgb)); @@ -194,7 +199,7 @@ impl Arranger { (||Tui::bold(true, Tui::fg(TuiTheme::g(128), "Playing")).boxed()).into() } fn elapsed_row_cells <'a> (&'a self) -> BoxThunk<'a, TuiOut> { - (move||Fixed::y(2, Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { + (move||Align::x(Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { //let color = track.color(); let color: ItemPalette = track.color().dark.into(); let timebase = self.clock().timebase(); @@ -215,7 +220,7 @@ impl Arranger { (||Tui::bold(true, Tui::fg(TuiTheme::g(128), "Next")).boxed()).into() } fn next_row_cells <'a> (&'a self) -> BoxThunk<'a, TuiOut> { - (move||Fixed::y(2, Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { + (move||Align::x(Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { let color: ItemPalette = track.color(); let color: ItemPalette = track.color().dark.into(); let cell = Self::cell_until_next(track, &self.clock().playhead); @@ -231,20 +236,20 @@ impl Arranger { } fn track_row_cells <'a> (&'a self) -> BoxThunk<'a, TuiOut> { let iter = ||self.tracks_with_widths(); - (move||Fixed::y(2, Map::new(iter, move|(_, track, x1, x2), i| { + (move||Align::x(Map::new(iter, move|(_, track, x1, x2), i| { let color = track.color(); let name = Push::x(1, &track.name); Tui::bg(color.base.rgb, map_east(x1 as u16, (x2 - x1) as u16, Tui::fg_bg(color.lightest.rgb, color.base.rgb, - phat_cell(color, color.darkest.rgb.into(), - Tui::bold(true, name))))) })).boxed()).into() + //phat_cell(color, color.darkest.rgb.into(), + Tui::bold(true, Fill::x(Align::x(name)))))) })).boxed()).into() } fn input_row_header <'a> (&'a self) -> BoxThunk<'a, TuiOut> { (||Fill::x(Tui::bold(true, Tui::fg_bg(TuiTheme::g(0), TuiTheme::g(200), "[ ] In 1: Korg"))).boxed()).into() } fn input_row_cells <'a> (&'a self) -> BoxThunk<'a, TuiOut> { - (move||Fixed::y(2, Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { + (move||Align::x(Map::new(||self.tracks_with_widths(), move|(_, track, x1, x2), i| { let w = (x2 - x1) as u16; let cell = Bsp::s("[Rec]", "[Mon]"); let color: ItemPalette = track.color().dark.into(); @@ -260,7 +265,7 @@ impl Arranger { ArrangerSelection::Scene(s) => Some(s), _ => None }; - Tui::bg(Color::Rgb(0,0,0), Fill::y(Map::new( + Tui::bg(Color::Reset, Fill::y(Map::new( ||self.scenes_with_heights(2), move|(_, scene, y1, y2), i| { let h = (y2 - y1) as u16; @@ -296,9 +301,8 @@ impl Arranger { }; let tracks = move||self.tracks_with_widths(); let scenes = ||self.scenes_with_heights(2); - (move||Fixed::y(2, Map::new(tracks, move|(_, track, x1, x2), t| { - let w = (x2 - x1) as u16; - let cell = Bsp::s("[Rec]", "[Mon]"); + (move||Align::x(Map::new(tracks, move|(_, track, x1, x2), t| { + let w = (x2 - x1) as u16; let color: ItemPalette = track.color().dark.into(); let last_color = Arc::new(RwLock::new(ItemPalette::from(Color::Rgb(0, 0, 0)))); let cells = Map::new(scenes, move|(_, scene, y1, y2), s| { @@ -318,7 +322,7 @@ impl Arranger { //TuiTheme::g(32).into(), //TuiTheme::g(32).into(), //); - let active = editing && selected_track == Some(t) && selected_scene == Some(s); + let active = editing && selected_scene == Some(s) && selected_track == Some(t); let editor = Thunk::new(||&self.editor); let cell = Thunk::new(move||phat_sel_3( selected_track == Some(t) && selected_scene == Some(s), @@ -342,7 +346,7 @@ impl Arranger { map_east( x1 as u16, w, - Fixed::x(w, Tui::bg(Color::Rgb(0,0,0), Fill::y(cells)).boxed()) + Fixed::x(w, Tui::bg(Color::Reset, Fill::y(cells)).boxed()) ) })).boxed()).into() }