diff --git a/config/config_groovebox.edn b/config/config_groovebox.edn index 3afc185b..2dfc1e45 100644 --- a/config/config_groovebox.edn +++ b/config/config_groovebox.edn @@ -12,9 +12,14 @@ (layer "./keys_global.edn")) (view (bsp/a :view-dialog (bsp/w :view-meters-output (bsp/e :view-meters-input - (bsp/n (fixed/y 6 (bsp/e :view-sample-status :view-sample-viewer)) + (bsp/n + (fixed/y :h-sample-detail + (bsp/e (fill/y (fixed/x 20 (align/nw :view-sample-status))) + :view-sample-viewer)) (bsp/e - (fill/y (align/n (bsp/s :view-status-v (bsp/s - (bsp/s :view-midi-ports-status :view-audio-ports-status) - (bsp/n :view-editor-status :view-pool))))) - (bsp/e :view-samples-keys :view-editor))))))) + (fill/y (align/n + (bsp/s :view-status-v + (bsp/s :view-midi-ports-status :view-audio-ports-status)))) + (bsp/w + (bsp/s :view-editor-status :view-pool) + (bsp/e :view-samples-keys :view-editor)))))))) diff --git a/crates/app/src/model.rs b/crates/app/src/model.rs index 4948c2c1..9315a26f 100644 --- a/crates/app/src/model.rs +++ b/crates/app/src/model.rs @@ -189,6 +189,9 @@ impl App { fn w_sidebar (&self) -> u16 { self.project.w_sidebar(self.editor.is_some()) } + fn h_sample_detail (&self) -> u16 { + 4.max(self.height() as u16 * 3 / 9) + } fn focus_editor (&self) -> bool { self.is_editing() } diff --git a/crates/device/src/sampler/sampler_api.rs b/crates/device/src/sampler/sampler_api.rs index ebd62ac7..d7b391f7 100644 --- a/crates/device/src/sampler/sampler_api.rs +++ b/crates/device/src/sampler/sampler_api.rs @@ -50,21 +50,23 @@ impl Sampler { #[tengri_proc::command(Sampler)] impl SamplerCommand { - fn record_toggle (sampler: &mut Sampler, sample: usize) -> Perhaps { - if sampler.recording.is_some() { - Self::record_finish(sampler) + fn record_toggle (sampler: &mut Sampler, slot: usize) -> Perhaps { + let recording = sampler.recording.as_ref().map(|x|x.0); + Self::record_finish(sampler); + // autoslice: continue recording at next slot + if recording != Some(slot) { + Self::record_begin(sampler, slot) } else { - Self::record_begin(sampler, sample) + Ok(None) } } - fn record_begin (sampler: &mut Sampler, pitch: usize) -> Perhaps { + fn record_begin (sampler: &mut Sampler, slot: usize) -> Perhaps { sampler.recording = Some(( - pitch, + slot, Arc::new(RwLock::new(Sample::new( "Sample", 0, 0, vec![vec![];sampler.audio_ins.len()] ))) - -)); + )); Ok(None) } fn record_finish (sampler: &mut Sampler) -> Perhaps { @@ -82,39 +84,39 @@ impl SamplerCommand { sampler.recording = None; Ok(None) } - fn play_sample (sampler: &mut Sampler, pitch: usize) -> Perhaps { - if let Some(ref sample) = sampler.mapped[pitch] { + fn play_sample (sampler: &mut Sampler, slot: usize) -> Perhaps { + if let Some(ref sample) = sampler.mapped[slot] { sampler.voices.write().unwrap().push(Sample::play(sample, 0, &u7::from(128))); } Ok(None) } - fn stop_sample (sampler: &mut Sampler, pitch: usize) -> Perhaps { + fn stop_sample (sampler: &mut Sampler, slot: usize) -> Perhaps { todo!(); Ok(None) } //fn select (&self, state: &mut Sampler, i: usize) -> Option { //Self::Select(state.set_note_pos(i)) //} - ///// Assign sample to pitch - //fn set (&self, pitch: u7, sample: Option>>) -> Option { - //let i = pitch.as_int() as usize; + ///// Assign sample to slot + //fn set (&self, slot: u7, sample: Option>>) -> Option { + //let i = slot.as_int() as usize; //let old = self.mapped[i].clone(); //self.mapped[i] = sample; //Some(Self::Set(old)) //} - //fn set_start (&self, state: &mut Sampler, pitch: u7, frame: usize) -> Option { + //fn set_start (&self, state: &mut Sampler, slot: u7, frame: usize) -> Option { //todo!() //} - //fn set_gain (&self, state: &mut Sampler, pitch: u7, g: f32) -> Option { + //fn set_gain (&self, state: &mut Sampler, slot: u7, g: f32) -> Option { //todo!() //} - //fn note_on (&self, state: &mut Sampler, pitch: u7, v: u7) -> Option { + //fn note_on (&self, state: &mut Sampler, slot: u7, v: u7) -> Option { //todo!() //} - //fn note_off (&self, state: &mut Sampler, pitch: u7) -> Option { + //fn note_off (&self, state: &mut Sampler, slot: u7) -> Option { //todo!() //} - //fn set_sample (&self, state: &mut Sampler, pitch: u7, s: Option>>) -> Option { + //fn set_sample (&self, state: &mut Sampler, slot: u7, s: Option>>) -> Option { //Some(Self::SetSample(p, state.set_sample(p, s))) //} //fn import (&self, state: &mut Sampler, c: FileBrowserCommand) -> Option { @@ -169,9 +171,9 @@ impl SamplerCommand { ////("set/gain" [i: u7, g: f32] ////Some(Self::SetGain(i.expect("no index"), g.expect("no gain")))) ////("note/on" [p: u7, v: u7] - ////Some(Self::NoteOn(p.expect("no pitch"), v.expect("no velocity")))) + ////Some(Self::NoteOn(p.expect("no slot"), v.expect("no velocity")))) ////("note/off" [p: u7] - ////Some(Self::NoteOff(p.expect("no pitch")))))); + ////Some(Self::NoteOff(p.expect("no slot")))))); } #[tengri_proc::command(Sampler)]