diff --git a/crates/tek/src/groovebox.rs b/crates/tek/src/groovebox.rs index 5152b397..69c3ebb8 100644 --- a/crates/tek/src/groovebox.rs +++ b/crates/tek/src/groovebox.rs @@ -61,6 +61,7 @@ render!(|self:GrooveboxTui|{ let phrase_w = if w > 60 { 20 } else if w > 40 { 15 } else { 10 }; let pool_w = if self.pool.visible { phrase_w } else { 0 }; let sampler_w = 11; + let note_pt = self.editor.note_point(); Fill::wh(lay!([ &self.size, Fill::wh(Align::s(Fixed::h(2, GrooveboxStatus::from(self)))), @@ -76,8 +77,20 @@ render!(|self:GrooveboxTui|{ PhraseSelector::next_phrase(&self.player), ]))), row!([ - Tui::split_n(false, 1, - MidiEditStatus(&self.editor), + Tui::split_n(false, 5, + col!([ + row!(|add|{ + if let Some(sample) = &self.sampler.mapped[note_pt] { + add(&format!("Sample {}", sample.read().unwrap().end))?; + } + add(&MidiEditStatus(&self.editor))?; + Ok(()) + }), + lay!([ + Outer(Style::default().fg(TuiTheme::g(128))), + Fill::w(Fixed::h(4, SampleViewer(None))), + ]), + ]), Tui::split_w(false, pool_w, Tui::pull_y(1, Fill::h(Align::e(PoolView(&self.pool)))), Tui::split_e(false, sampler_w, Fill::wh(col!([ @@ -91,12 +104,6 @@ render!(|self:GrooveboxTui|{ ])) }); -struct Meters<'a>(&'a[f32]); -render!(|self: Meters<'a>|col!([ - &format!("L/{:>+9.3}", self.0[0]), - &format!("R/{:>+9.3}", self.0[1]), -])); - struct GrooveboxSamples<'a>(&'a GrooveboxTui); render!(|self: GrooveboxSamples<'a>|{ let note_lo = self.0.editor.note_lo().load(Relaxed); diff --git a/crates/tek/src/lib.rs b/crates/tek/src/lib.rs index 934eb858..091e2fef 100644 --- a/crates/tek/src/lib.rs +++ b/crates/tek/src/lib.rs @@ -15,6 +15,8 @@ pub use self::jack::*; pub mod midi; pub(crate) use self::midi::*; +pub mod meter; pub(crate) use self::meter::*; + pub mod piano_h; pub(crate) use self::piano_h::*; pub mod transport; pub(crate) use self::transport::*; diff --git a/crates/tek/src/meter.rs b/crates/tek/src/meter.rs new file mode 100644 index 00000000..b52b8429 --- /dev/null +++ b/crates/tek/src/meter.rs @@ -0,0 +1,8 @@ +use crate::*; + +pub struct Meters<'a>(pub &'a[f32]); + +render!(|self: Meters<'a>|col!([ + &format!("L/{:>+9.3}", self.0[0]), + &format!("R/{:>+9.3}", self.0[1]), +])); diff --git a/crates/tek/src/sampler.rs b/crates/tek/src/sampler.rs index b3d69db6..bb74c2bb 100644 --- a/crates/tek/src/sampler.rs +++ b/crates/tek/src/sampler.rs @@ -28,6 +28,10 @@ pub use self::sampler_tui::SamplerTui; pub mod sample_import; pub(crate) use self::sample_import::*; +pub mod sample_viewer; +pub(crate) use self::sample_viewer::*; +pub use self::sample_viewer::SampleViewer; + /// The sampler plugin plays sounds. #[derive(Debug)] pub struct Sampler { diff --git a/crates/tek/src/sampler/sample_viewer.rs b/crates/tek/src/sampler/sample_viewer.rs new file mode 100644 index 00000000..3dcedb51 --- /dev/null +++ b/crates/tek/src/sampler/sample_viewer.rs @@ -0,0 +1,21 @@ +use crate::*; +use std::ops::Deref; +use ratatui::{prelude::Rect, widgets::{Widget, canvas::{Canvas, Points}}}; + +pub struct SampleViewer<'a>(pub Option<&'a Arc>>); +render!(|self: SampleViewer<'a>|render(|to|{ + let [x, y, width, height] = to.area(); + let area = Rect { x, y, width, height }; + Canvas::default() + .x_bounds([0.0, f64::from(width)]) + .y_bounds([0.0, f64::from(height)]) + .paint(|ctx|{ + ctx.draw(&Points { + coords: &[(0., 0.), (1., 2.), (3., 4.)], + color: Color::Rgb(255,0,0) + }) + // TODO + }) + .render(area, &mut to.buffer); + Ok(()) +}));