diff --git a/midi/src/lib.rs b/midi/src/lib.rs index 60eac4ec..dc109783 100644 --- a/midi/src/lib.rs +++ b/midi/src/lib.rs @@ -10,6 +10,7 @@ mod midi_pool; pub use midi_pool::*; mod midi_range; pub use midi_range::*; mod midi_view; pub use midi_view::*; mod piano_h; pub use self::piano_h::*; +mod piano_v; pub use self::piano_v::*; pub(crate) use ::tek_time::*; pub(crate) use ::tek_jack::{*, jack::*}; diff --git a/midi/src/piano_h.rs b/midi/src/piano_h.rs index e82d0ed8..9b1e0698 100644 --- a/midi/src/piano_h.rs +++ b/midi/src/piano_h.rs @@ -18,7 +18,7 @@ pub struct PianoHorizontal { impl PianoHorizontal { pub fn new (clip: Option<&Arc>>) -> Self { let size = Measure::new(); - let mut range = MidiRangeModel::from((24, true)); + let mut range = MidiRangeModel::from((12, true)); range.time_axis = size.x.clone(); range.note_axis = size.y.clone(); let piano = Self { diff --git a/midi/src/piano_v.rs b/midi/src/piano_v.rs new file mode 100644 index 00000000..27bd1d5e --- /dev/null +++ b/midi/src/piano_v.rs @@ -0,0 +1,34 @@ +use crate::*; +use Color::*; +pub struct OctaveVertical { + on: [bool; 12], + colors: [Color; 3] +} +impl Default for OctaveVertical { + fn default () -> Self { + Self { + on: [false; 12], + colors: [Rgb(255,255,255), Rgb(0,0,0), Rgb(255,0,0)] + } + } +} +impl OctaveVertical { + fn color (&self, pitch: usize) -> Color { + let pitch = pitch % 12; + self.colors[if self.on[pitch] { 2 } else { + match pitch { 0 | 2 | 4 | 5 | 6 | 8 | 10 => 0, _ => 1 } + }] + } +} +impl Content for OctaveVertical { + fn content (&self) -> impl Render { + row!( + Tui::fg_bg(self.color(0), self.color(1), "▙"), + Tui::fg_bg(self.color(2), self.color(3), "▙"), + Tui::fg_bg(self.color(4), self.color(5), "▌"), + Tui::fg_bg(self.color(6), self.color(7), "▟"), + Tui::fg_bg(self.color(8), self.color(9), "▟"), + Tui::fg_bg(self.color(10), self.color(11), "▟"), + ) + } +} diff --git a/tek/src/view/input.rs b/tek/src/view/input.rs index 51fa23d0..c2952082 100644 --- a/tek/src/view/input.rs +++ b/tek/src/view/input.rs @@ -37,6 +37,9 @@ impl Tek { fn view_clips_into (&self) -> impl Content + use<'_> { self.row_top(self.w(), 2, Bsp::s(Align::e("Input:"), Align::e("Into:")), - self.per_track_top(|_, _|Tui::bg(Reset, Align::c(Bsp::s("▙▙█▙▙▙█", " ----- "))))) + self.per_track_top(|_, _|Tui::bg(Reset, Align::c(Bsp::s( + OctaveVertical::default(), + " ------ " + ))))) } } diff --git a/tek/src/view/output.rs b/tek/src/view/output.rs index de28d27d..1989f340 100644 --- a/tek/src/view/output.rs +++ b/tek/src/view/output.rs @@ -32,7 +32,10 @@ impl Tek { } fn view_clips_from (&self) -> impl Content + use<'_> { let heading = Align::e("From:"); - let content = self.per_track_top(|_, _|Tui::bg(Reset, Align::c(Bsp::s("▙▙█▙▙▙█", " ----- ")))); + let content = self.per_track_top(|_, _|Tui::bg(Reset, Align::c(Bsp::s( + OctaveVertical::default(), + " ------ " + )))); self.row_top(self.w(), 2, heading, content) } fn view_clips_next (&self) -> impl Content + use<'_> {