diff --git a/crates/tek_core/src/time.rs b/crates/tek_core/src/time.rs index 3c751210..65d64d0b 100644 --- a/crates/tek_core/src/time.rs +++ b/crates/tek_core/src/time.rs @@ -79,6 +79,14 @@ impl Timebase { } impl Default for Timebase { fn default () -> Self { Self::new(48000f64, 150f64, 96f64) } } impl Instant { + pub fn zero (timebase: &Arc) -> Self { + Self { + usec: 0.into(), + sample: 0.into(), + pulse: 0.into(), + timebase: timebase.clone(), + } + } pub fn from_usec (timebase: &Arc, usec: f64) -> Self { Self { usec: usec.into(), diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index b5baed4c..52af81db 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -393,7 +393,7 @@ impl PhrasePlayer { pub fn enqueue_next (&mut self, phrase: Option<&Arc>>) { let start = self.clock.next_launch_pulse(); self.next_phrase = Some(( - Instant::from_pulse(&self.clock.timebase, start as f64), + Instant::from_pulse(&self.clock.timebase(), start as f64), phrase.map(|p|p.clone()) )); self.reset = true; diff --git a/crates/tek_sequencer/src/sequencer_snd.rs b/crates/tek_sequencer/src/sequencer_snd.rs index 696fbb34..8e0831b2 100644 --- a/crates/tek_sequencer/src/sequencer_snd.rs +++ b/crates/tek_sequencer/src/sequencer_snd.rs @@ -26,8 +26,8 @@ impl Audio for PhrasePlayer { let output = &mut self.midi_out_buf; let notes_on = &mut self.notes_out.write().unwrap(); let frame0 = frame0.saturating_sub(start_frame); - let frameN = frame0 + frames; - let ticks = self.clock.timebase.pulses_between_samples(frame0, frameN); + let frame_n = frame0 + frames; + let ticks = self.clock.timebase().pulses_between_samples(frame0, frame_n); let mut buf = Vec::with_capacity(8); for (sample, tick) in ticks { let tick = tick % phrase.length; @@ -55,7 +55,7 @@ impl Audio for PhrasePlayer { if self.monitoring { self.midi_out_buf[frame].push(bytes.to_vec()) } if self.recording { phrase.record_event({ - let pulse = self.clock.timebase.samples_to_pulse( + let pulse = self.clock.timebase().samples_to_pulse( (frame0 + frame - start_frame) as f64 ); let quantized = (pulse / quant).round() * quant; diff --git a/crates/tek_sequencer/src/transport.rs b/crates/tek_sequencer/src/transport.rs index 3659d235..c873d50c 100644 --- a/crates/tek_sequencer/src/transport.rs +++ b/crates/tek_sequencer/src/transport.rs @@ -1,8 +1,6 @@ use crate::*; #[derive(Debug, Default)] pub struct TransportTime { - /// Current sample sr, tempo, and PPQ. - pub timebase: Arc, /// Current moment in time pub instant: Instant, /// Note quantization factor @@ -12,6 +10,9 @@ pub struct TransportTime { /// Playback state pub playing: RwLock>, } +impl TransportTime { + pub fn timebase (&self) -> &Arc { &self.instant.timebase } +} impl PulsePosition for TransportTime { #[inline] fn pulse (&self) -> &TimeUnit { self.instant.pulse() } } @@ -58,13 +59,12 @@ impl TransportToolbar { clock: match clock { Some(clock) => clock.clone(), None => { - let timebase = Timebase::default(); + let timebase = Arc::new(Timebase::default()); Arc::new(TransportTime { playing: Some(TransportState::Stopped).into(), quant: 24.into(), sync: (timebase.ppq().get() * 4.).into(), instant: Instant::default(), - timebase: timebase.into(), }) } } diff --git a/crates/tek_sequencer/src/transport_cmd.rs b/crates/tek_sequencer/src/transport_cmd.rs index cc46650b..04f2b2bf 100644 --- a/crates/tek_sequencer/src/transport_cmd.rs +++ b/crates/tek_sequencer/src/transport_cmd.rs @@ -24,12 +24,12 @@ impl TransportToolbar { Ok(Some(true)) } fn handle_bpm (&mut self, from: &TuiInput) -> Perhaps { - let bpm = self.clock.timebase.bpm().get(); + let bpm = self.clock.timebase().bpm().get(); match from.event() { - key!(KeyCode::Char(',')) => { self.clock.timebase.bpm.set(bpm - 1.0); }, - key!(KeyCode::Char('.')) => { self.clock.timebase.bpm.set(bpm + 1.0); }, - key!(KeyCode::Char('<')) => { self.clock.timebase.bpm.set(bpm - 0.001); }, - key!(KeyCode::Char('>')) => { self.clock.timebase.bpm.set(bpm + 0.001); }, + key!(KeyCode::Char(',')) => { self.clock.timebase().bpm.set(bpm - 1.0); }, + key!(KeyCode::Char('.')) => { self.clock.timebase().bpm.set(bpm + 1.0); }, + key!(KeyCode::Char('<')) => { self.clock.timebase().bpm.set(bpm - 0.001); }, + key!(KeyCode::Char('>')) => { self.clock.timebase().bpm.set(bpm + 0.001); }, _ => return Ok(None) } Ok(Some(true)) diff --git a/crates/tek_sequencer/src/transport_tui.rs b/crates/tek_sequencer/src/transport_tui.rs index 447c896d..dc7e6030 100644 --- a/crates/tek_sequencer/src/transport_tui.rs +++ b/crates/tek_sequencer/src/transport_tui.rs @@ -15,7 +15,7 @@ impl Content for TransportToolbar { row!( self.focus.wrap(self.focused, TransportToolbarFocus::Bpm, &Outset::X(1u16, { - let bpm = self.clock.timebase.bpm().get(); + let bpm = self.clock.timebase().bpm().get(); row! { "BPM ", format!("{}.{:03}", bpm as usize, (bpm * 1000.0) % 1000.0) } })), //let quant = self.focus.wrap(self.focused, TransportToolbarFocus::Quant, &Outset::X(1u16, row! {