diff --git a/midi/src/keys_edit.edn b/midi/src/keys_edit.edn index d8c75f5b..0c9d68a5 100644 --- a/midi/src/keys_edit.edn +++ b/midi/src/keys_edit.edn @@ -15,7 +15,7 @@ (@minus time/zoom :time-zoom-next) (@z time/lock) -(@enter add :false) -(@shift-enter add :true) -(@del del :false) -(@shift-del del :true) +(@enter note/put) +(@shift-enter note/append) +(@del note/del) +(@shift-del note/del) diff --git a/midi/src/midi_edit.rs b/midi/src/midi_edit.rs index 85fb3231..58feefdf 100644 --- a/midi/src/midi_edit.rs +++ b/midi/src/midi_edit.rs @@ -183,8 +183,9 @@ impl MidiViewer for MidiEditor { fn set_clip (&mut self, p: Option<&Arc>>) { self.mode.set_clip(p) } } atom_command!(MidiEditCommand: |state: MidiEditor| { - ("note/put" [_a: bool] Self::PutNote) - ("note/del" [_a: bool] Self::PutNote) + ("note/append" [] Self::AppendNote) + ("note/put" [] Self::PutNote) + ("note/del" [] Self::DelNote) ("note/pos" [a: usize] Self::SetNoteCursor(a.expect("no note cursor"))) ("note/len" [a: usize] Self::SetNoteLength(a.expect("no note length"))) ("time/pos" [a: usize] Self::SetTimeCursor(a.expect("no time cursor"))) @@ -196,6 +197,7 @@ atom_command!(MidiEditCommand: |state: MidiEditor| { // TODO: 1-9 seek markers that by default start every 8th of the clip AppendNote, PutNote, + DelNote, SetNoteCursor(usize), SetNoteLength(usize), SetNoteScroll(usize), @@ -218,6 +220,7 @@ impl Command for MidiEditCommand { use MidiEditCommand::*; match self { Show(clip) => { state.set_clip(clip.as_ref()); }, + DelNote => {}, PutNote => { state.put_note(false); }, AppendNote => { state.put_note(true); }, SetTimeZoom(x) => { state.time_zoom().set(x); state.redraw(); }, diff --git a/tek/src/arranger.edn b/tek/src/arranger.edn index dcf55404..d75e4150 100644 --- a/tek/src/arranger.edn +++ b/tek/src/arranger.edn @@ -18,7 +18,7 @@ (@shift-space clock toggle 0) (@ctrl-a scene add) (@ctrl-t track add) - (@tab edit) + (@tab edit :clip) (@c color)} {def :keys-mix diff --git a/tek/src/keys.edn b/tek/src/keys.edn index 74494b06..38b458dd 100644 --- a/tek/src/keys.edn +++ b/tek/src/keys.edn @@ -4,5 +4,5 @@ (@shift-space clock toggle 0) (@ctrl-a scene add) (@ctrl-t track add) -(@tab edit) +(@tab edit :clip) (@c color) diff --git a/tek/src/keys_clip.edn b/tek/src/keys_clip.edn index 0fe68e6d..be797c14 100644 --- a/tek/src/keys_clip.edn +++ b/tek/src/keys_clip.edn @@ -7,7 +7,7 @@ (@right select :track-next :scene) (@d select :track-next :scene) -(@q enqueue :clip) +(@q enqueue :track :scene) (@c clip color :track :scene) (@g clip get) (@p clip put) diff --git a/tek/src/lib.rs b/tek/src/lib.rs index 7dd3f5a7..e95142b6 100644 --- a/tek/src/lib.rs +++ b/tek/src/lib.rs @@ -191,11 +191,11 @@ view!(TuiOut: |self: Tek| self.size.of(View(self, self.view)); { ":sampler" => self.view_sampler(self.is_editing(), &self.editor).boxed(), ":status" => self.view_editor().boxed(), ":toolbar" => self.view_clock().boxed(), - ":tracks" => self.view_row(self.w(), 3, self.track_header(), self.track_cells()).boxed(), - ":inputs" => self.view_row(self.w(), 3, self.input_header(), self.input_cells()).boxed(), - ":outputs" => self.view_row(self.w(), 3, self.output_header(), self.output_cells()).boxed(), + ":tracks" => self.view_row(self.w(), 2, self.track_header(), self.track_cells()).boxed(), + ":inputs" => self.view_row(self.w(), 2, self.input_header(), self.input_cells()).boxed(), + ":outputs" => self.view_row(self.w(), 2, self.output_header(), self.output_cells()).boxed(), ":scenes" => Outer(false, Style::default().fg(Tui::g(0))).enclose_bg(self.view_row( - self.w(), self.size.h().saturating_sub(12) as u16, + self.w(), self.size.h().saturating_sub(8) as u16, self.scene_header(), self.clip_columns() )).boxed() }); @@ -550,7 +550,7 @@ impl Tek { let top = if s == 0 { Some(Reset) } else if neighbor { - None + Some(last_color.read().unwrap().light.rgb) } else { Some(last_color.read().unwrap().base.rgb) }; @@ -569,25 +569,23 @@ impl Tek { "edit".into() }; let label = move||{ - let stop = self.fmtd_stop.clone(); let clip = scene.clips[t].clone(); - Tui::fg(fg, Push::x(1, Tui::bold(true, clip - .map(|c|c.read().unwrap().name.clone()) - .unwrap_or(stop)))) + let icon = " ⏹ "; + let name = clip.map(|c|c.read().unwrap().name.clone()); + Align::nw(Tui::fg(fg, Bsp::e(icon, Bsp::e(Tui::bold(true, name), " ")))) }; - map_south(y1 as u16, h, Push::y(1, Fixed::y(h, Either::new(active, Thunk::new(move||Bsp::a( - Fill::xy(Align::nw(button(tab, Tui::fg_bg(fg, bg.base.rgb, name.clone())))), + Fill::xy(Align::nw(button(tab, label()))), &self.editor)), Thunk::new(move||Bsp::a( When::new(selected, Fill::y(Align::n(button(tab, "edit")))), - Fill::xy(phat_sel_3( + phat_sel_3( selected, - label(), - label(), + Fill::xy(label()), + Fill::xy(label()), top, mid, low - )) + ) )), )))) @@ -623,7 +621,7 @@ impl Tek { fn input_header <'a> (&'a self) -> ThunkBox<'a, TuiOut> { let fg = Tui::g(224); let bg = Tui::g(64); - (move||Bsp::s(Fill::x(Align::w(self.button(" I ", format!(" midi ins ({})", self.midi_ins().len())))), self.midi_ins().get(0).map(|inp|Bsp::s( + (move||Bsp::s(Fill::x(Align::w(self.button(" I ", format!(" midi ins ({})", self.midi_ins().len())))), self.midi_ins().get(0).map(|inp|Bsp::s( Fill::x(Tui::bold(true, Tui::fg_bg(fg, bg, Align::w(inp.name.clone())))), inp.connect.get(0).map(|connect|Fill::x(Align::w(Tui::bold(false, Tui::fg_bg(fg, bg, connect.info()))))), @@ -632,7 +630,7 @@ impl Tek { fn output_header <'a> (&'a self) -> ThunkBox<'a, TuiOut> { let fg = Tui::g(224); let bg = Tui::g(64); - (move||Bsp::s(Fill::x(Align::w(self.button(" O ", format!(" midi outs ({}) ", self.midi_outs().len())))), self.midi_outs().get(0).map(|out|Bsp::s( + (move||Bsp::s(Fill::x(Align::w(self.button(" O ", format!(" midi outs ({}) ", self.midi_outs().len())))), self.midi_outs().get(0).map(|out|Bsp::s( Fill::x(Tui::bold(true, Tui::fg_bg(fg, bg, Align::w(out.name.clone())))), out.connect.get(0).map(|connect|Fill::x(Align::w(Tui::bold(false, Tui::fg_bg(fg, bg, connect.info()))))), @@ -1003,27 +1001,24 @@ trait HasTracks: HasSelection + HasClock + HasJack + HasEditor + Send + Sync { fn track_cells <'a> (&'a self) -> ThunkBox<'a, TuiOut> { let iter = ||self.tracks_sizes(self.is_editing(), self.editor_w()); (move||Align::x(Map::new(iter, move|(_, track, x1, x2), i| { - let name = Push::x(1, &track.name); + let name = &track.name; let color = track.color; let fg = color.lightest.rgb; let bg = color.base.rgb; let active = self.selected().track() == Some(i + 1); let bfg = if active { Rgb(255,255,255) } else { Rgb(0,0,0) }; let border = Style::default().fg(bfg).bg(bg); - Tui::bg(bg, map_east(x1 as u16, (x2 - x1) as u16, - Outer(false, border) - .enclose(Tui::fg_bg(fg, bg, Tui::bold(true, Fill::x(Align::x(name))))) - )) + let content = Tui::fg_bg(fg, bg, Tui::bold(true, Fill::x(Align::nw(Bsp::e(" ", name))))); + Tui::bg(bg, map_east(x1 as u16, (x2 - x1) as u16, Outer(false, border).enclose(content))) })).boxed()).into() } fn input_cells <'a> (&'a self) -> ThunkBox<'a, TuiOut> { - (move||Align::x(Map::new(||self.tracks_sizes(self.is_editing(), self.editor_w()), move|(_, track, x1, x2), i| { + let tracks = ||self.tracks_sizes(self.is_editing(), self.editor_w()); + (move||Align::x(Map::new(tracks, move|(_, track, x1, x2), i| { let w = (x2 - x1) as u16; let color: ItemPalette = track.color; - map_east(x1 as u16, w, Fixed::x(w, Self::cell(color, Bsp::n( - Self::rec_mon(color.base.rgb, false, false), - phat_hi(color.base.rgb, color.dark.rgb) - )))) + map_east(x1 as u16, w, Fixed::x(w, Self::cell(color, + Self::rec_mon(color.base.rgb, false, false)))) })).boxed()).into() } fn rec_mon (bg: Color, rec: bool, mon: bool) -> impl Content { @@ -1036,13 +1031,11 @@ trait HasTracks: HasSelection + HasClock + HasJack + HasEditor + Send + Sync { ) } fn output_cells <'a> (&'a self) -> ThunkBox<'a, TuiOut> { - (move||Align::x(Map::new(||self.tracks_sizes(self.is_editing(), self.editor_w()), move|(_, track, x1, x2), i| { + let tracks = ||self.tracks_sizes(self.is_editing(), self.editor_w()); + (move||Align::x(Map::new(tracks, move|(_, track, x1, x2), i| { let w = (x2 - x1) as u16; let color: ItemPalette = track.color; - map_east(x1 as u16, w, Fixed::x(w, Self::cell(color, Bsp::n( - Self::mute_solo(color.base.rgb, false, false), - phat_hi(color.dark.rgb, color.darker.rgb) - )))) + map_east(x1 as u16, w, Fixed::x(w, Self::cell(color, Self::mute_solo(color.base.rgb, false, false)))) })).boxed()).into() } fn mute_solo (bg: Color, mute: bool, solo: bool) -> impl Content { diff --git a/tek/src/view_arranger.edn b/tek/src/view_arranger.edn index d1270286..f1976c4e 100644 --- a/tek/src/view_arranger.edn +++ b/tek/src/view_arranger.edn @@ -1,5 +1,3 @@ -(bsp/s (fixed/y 2 :toolbar) +(bsp/s (max/y 1 :toolbar) (fill/x (align/c (bsp/w (fixed/x :pool-w :pool) - (bsp/n (fixed/y 3 :outputs) - (bsp/n (fixed/y 3 :inputs) - (bsp/n (fixed/y 3 :tracks) :scenes))))))) + (bsp/n :outputs (bsp/n :inputs (bsp/n :tracks :scenes)))))))