diff --git a/crates/tek/src/groovebox.rs b/crates/tek/src/groovebox.rs index 69c3ebb8..8dd04d17 100644 --- a/crates/tek/src/groovebox.rs +++ b/crates/tek/src/groovebox.rs @@ -88,7 +88,13 @@ render!(|self:GrooveboxTui|{ }), lay!([ Outer(Style::default().fg(TuiTheme::g(128))), - Fill::w(Fixed::h(4, SampleViewer(None))), + Fill::w(Fixed::h(4, if let Some((_, sample)) = &self.sampler.recording { + SampleViewer(Some(sample.clone())) + } else if let Some(sample) = &self.sampler.mapped[note_pt] { + SampleViewer(Some(sample.clone())) + } else { + SampleViewer(None) + })), ]), ]), Tui::split_w(false, pool_w, diff --git a/crates/tek/src/sampler.rs b/crates/tek/src/sampler.rs index bb74c2bb..0c106cab 100644 --- a/crates/tek/src/sampler.rs +++ b/crates/tek/src/sampler.rs @@ -38,7 +38,7 @@ pub struct Sampler { pub jack: Arc>, pub name: String, pub mapped: [Option>>;128], - pub recording: Option<(usize, Sample)>, + pub recording: Option<(usize, Arc>)>, pub unmapped: Vec>>, pub voices: Arc>>, pub midi_in: Port, @@ -75,31 +75,21 @@ impl Sampler { self.recording = None; } pub fn begin_recording (&mut self, index: usize) { - self.recording = Some( - (index, Sample::new("(new)", 0, 0, vec![vec![];self.audio_ins.len()])) - ); + self.recording = Some(( + index, + Arc::new(RwLock::new(Sample::new("(new)", 0, 0, vec![vec![];self.audio_ins.len()]))) + )); } pub fn finish_recording (&mut self) -> Option>> { let recording = self.recording.take(); if let Some((index, sample)) = recording { let old = self.mapped[index].clone(); - self.mapped[index] = Some(Arc::new(RwLock::new(sample))); + self.mapped[index] = Some(sample); old } else { None } } - pub fn record_chunk (&mut self, chunks: &[&[f32]]) { - if let Some((_, sample)) = &mut self.recording { - if chunks.len() != sample.channels.len() { - panic!() - } - for (chunk, channel) in chunks.iter().zip(sample.channels.iter_mut()) { - channel.extend_from_slice(chunk) - } - sample.end += chunks[0].len(); - } - } } pub enum SamplerCommand { @@ -157,6 +147,7 @@ impl Sampler { *input_meter = vec![0.0;audio_ins.len()]; } if let Some((_, sample)) = recording { + let mut sample = sample.write().unwrap(); if sample.channels.len() != audio_ins.len() { panic!("channel count mismatch"); } diff --git a/crates/tek/src/sampler/sample_viewer.rs b/crates/tek/src/sampler/sample_viewer.rs index 00d3e35e..cb54d0db 100644 --- a/crates/tek/src/sampler/sample_viewer.rs +++ b/crates/tek/src/sampler/sample_viewer.rs @@ -2,12 +2,12 @@ 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|{ +pub struct SampleViewer(pub Option>>); +render!(|self: SampleViewer|render(|to|{ let [x, y, width, height] = to.area(); let area = Rect { x, y, width, height }; let (x_bounds, y_bounds, coords): ([f64;2], [f64;2], &[(f64,f64)]) = - if let Some(sample) = self.0 { + if let Some(sample) = &self.0 { let sample = sample.read().unwrap(); ( [sample.start as f64, sample.end as f64],