diff --git a/config/config_groovebox.edn b/config/config_groovebox.edn index 24154b74..3f63ce1d 100644 --- a/config/config_groovebox.edn +++ b/config/config_groovebox.edn @@ -3,15 +3,16 @@ (info "A sequencer with built-in sampler.") (view - (bsp/a :view-dialog - (bsp/s (fixed/y 1 :view-transport) - (bsp/n (fixed/y 1 :view-status) - (bsp/w :view-meters-output - (bsp/e :view-meters-input - (bsp/n (fixed/y 5 :view-sample-viewer) - (bsp/w (fixed/x :w-sidebar :view-pool) - (bsp/e :view-samples-keys - (fill/y :view-editor)))))))))) + (bsp/a :view-dialog + (bsp/s (fixed/y 1 :view-transport) + (bsp/n (fixed/y 1 :view-status) + (bsp/w :view-meters-output + (bsp/e :view-meters-input + (bsp/n :view-sample-info + (bsp/n (fixed/y 5 :view-sample-viewer) + (bsp/w (fixed/x :w-sidebar :view-pool) + (bsp/e :view-samples-keys + (fill/y :view-editor))))))))))) (keys (layer-if :focus-pool-import "./keys_pool_file.edn") diff --git a/crates/app/src/view.rs b/crates/app/src/view.rs index 4a2c7859..21743eb7 100644 --- a/crates/app/src/view.rs +++ b/crates/app/src/view.rs @@ -41,6 +41,15 @@ impl App { pub fn view_sample_viewer (&self) -> impl Content + use<'_> { self.sampler().map(|s|s.view_sample(self.editor().unwrap().get_note_pos())) } + pub fn view_sample_info (&self) -> impl Content + use<'_> { + self.sampler().map(|s|s.view_sample_info(self.editor().unwrap().get_note_pos())) + } + pub fn view_meters_input (&self) -> impl Content + use<'_> { + self.sampler().map(|s|s.view_meters_input()) + } + pub fn view_meters_output (&self) -> impl Content + use<'_> { + self.sampler().map(|s|s.view_meters_output()) + } pub fn view_dialog (&self) -> impl Content + use<'_> { When::new(self.dialog.is_some(), Bsp::b( Fill::xy(Tui::fg_bg(Rgb(64,64,64), Rgb(32,32,32), "")), @@ -56,12 +65,6 @@ impl App { ))) )) } - pub fn view_meters_input (&self) -> impl Content + use<'_> { - self.sampler().map(|s|s.view_meters_input()) - } - pub fn view_meters_output (&self) -> impl Content + use<'_> { - self.sampler().map(|s|s.view_meters_output()) - } } impl App { diff --git a/crates/device/src/sampler/sampler_model.rs b/crates/device/src/sampler/sampler_model.rs index ad429a9d..1d9ec18e 100644 --- a/crates/device/src/sampler/sampler_model.rs +++ b/crates/device/src/sampler/sampler_model.rs @@ -4,7 +4,7 @@ use crate::*; #[derive(Debug)] pub struct Sampler { /// Name of sampler. - pub name: String, + pub name: Arc, /// Device color. pub color: ItemTheme, /// Audio input ports. Samples get recorded here. @@ -55,7 +55,7 @@ impl Default for Sampler { input_meters: vec![0.0;2], output_meters: vec![0.0;2], audio_outs: vec![], - name: "tek_sampler".to_string(), + name: "tek_sampler".into(), mapped: [const { None };128], unmapped: vec![], voices: Arc::new(RwLock::new(vec![])), diff --git a/crates/device/src/sampler/sampler_view.rs b/crates/device/src/sampler/sampler_view.rs index b8fb9b20..ee67807b 100644 --- a/crates/device/src/sampler/sampler_view.rs +++ b/crates/device/src/sampler/sampler_view.rs @@ -100,33 +100,46 @@ impl Sampler { }))) } - pub fn status (&self, index: usize) -> impl Content { + pub fn view_sample_info (&self, note_pt: usize) -> impl Content + use<'_> { + Fill::x(Fixed::y(1, draw_info(if let Some((_, sample)) = &self.recording { + Some(sample) + } else if let Some(sample) = &self.mapped[note_pt] { + Some(sample) + } else { + None + }))) + } + + pub fn view_status (&self, index: usize) -> impl Content { draw_status(self.mapped[index].as_ref()) } pub fn view_meters_input (&self) -> impl Content + use<'_> { - Tui::bg(Black, Fixed::x(2, Map::east(1, ||self.input_meters.iter(), |value, _index|{ - Fill::y(RmsMeter(*value)) - }))) + draw_meters(&self.input_meters) } pub fn view_meters_output (&self) -> impl Content + use<'_> { - Tui::bg(Black, Fixed::x(2, Map::east(1, ||self.output_meters.iter(), |value, _index|{ - Fill::y(RmsMeter(*value)) - }))) + draw_meters(&self.output_meters) } } +fn draw_meters (meters: &[f32]) -> impl Content + use<'_> { + Tui::bg(Black, Fixed::x(2, Map::east(1, ||meters.iter(), |value, _index|{ + Fill::y(RmsMeter(*value)) + }))) +} + fn draw_list_item (sample: &Option>>) -> String { if let Some(sample) = sample { let sample = sample.read().unwrap(); - format!("{:8} {:3} {:6}-{:6}/{:6}", - sample.name, - sample.gain, - sample.start, - sample.end, - sample.channels[0].len() - ) + format!("{:8}", sample.name) + //format!("{:8} {:3} {:6}-{:6}/{:6}", + //sample.name, + //sample.gain, + //sample.start, + //sample.end, + //sample.channels[0].len() + //) } else { String::from("........") } @@ -187,6 +200,21 @@ fn draw_viewer (sample: Option<&Arc>>) -> impl Content + }) } +fn draw_info (sample: Option<&Arc>>) -> impl Content + use<'_> { + When(sample.is_some(), Thunk::new(move||{ + let sample = sample.unwrap().read().unwrap(); + let theme = ItemTheme::G[96]; + row!( + FieldH(theme, "Name", format!("{:<10}", sample.name.clone())), + FieldH(theme, "Length", format!("{:<8}", sample.channels[0].len())), + FieldH(theme, "Start", format!("{:<8}", sample.start)), + FieldH(theme, "End", format!("{:<8}", sample.end)), + FieldH(theme, "Transpose", " 0 "), + FieldH(theme, "Gain", format!("{}", sample.gain)), + ) + })) +} + fn draw_status (sample: Option<&Arc>>) -> impl Content { Tui::bold(true, Tui::fg(Tui::g(224), sample .map(|sample|{