From 799228e36614a062a52767ef912619d0d1a4cd25 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 1 Nov 2024 15:27:06 +0200 Subject: [PATCH] fix time trait usage --- crates/tek_core/src/time.rs | 6 ++--- crates/tek_sequencer/src/sequencer.rs | 6 ++--- crates/tek_sequencer/src/sequencer_snd.rs | 8 +++---- crates/tek_sequencer/src/transport.rs | 25 +++++++++----------- crates/tek_sequencer/src/transport_cmd.rs | 28 +++++++++-------------- crates/tek_sequencer/src/transport_snd.rs | 6 ++--- crates/tek_sequencer/src/transport_tui.rs | 4 ++-- 7 files changed, 36 insertions(+), 47 deletions(-) diff --git a/crates/tek_core/src/time.rs b/crates/tek_core/src/time.rs index d6586f11..3c751210 100644 --- a/crates/tek_core/src/time.rs +++ b/crates/tek_core/src/time.rs @@ -12,8 +12,8 @@ pub const DEFAULT_PPQ: f64 = 96.0; #[derive(Debug, Default)] pub struct TimeUnit(AtomicF64); impl TimeUnit { - fn get (&self) -> f64 { self.0.load(Ordering::Relaxed) } - fn set (&self, value: f64) { self.0.store(value, Ordering::Relaxed) } + pub fn get (&self) -> f64 { self.0.load(Ordering::Relaxed) } + pub fn set (&self, value: f64) { self.0.store(value, Ordering::Relaxed) } } /// Temporal resolutions: sample rate, tempo, MIDI pulses per quaver (beat) #[derive(Debug, Clone)] @@ -274,7 +274,7 @@ pub trait LaunchSync { } } /// Something that defines note quantization -pub trait Quantize { fn quant (&self) -> &TimeUnit; } +pub trait Quantize { fn quant (&self) -> &TimeUnit; } /// (pulses, name), assuming 96 PPQ pub const NOTE_DURATIONS: [(usize, &str);26] = [ (1, "1/384"), diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index a23f80d6..b5baed4c 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -400,14 +400,14 @@ impl PhrasePlayer { } pub fn samples_since_start (&self) -> Option { self.phrase.as_ref() - .map(|(started,_)|started.sample()) - .map(|started|started - self.clock.instant.sample()) + .map(|(started,_)|started.sample().get()) + .map(|started|(started - self.clock.instant.sample().get()) as usize) } pub fn playing_phrase (&self) -> Option<(usize, Arc>)> { if let ( Some(TransportState::Rolling), Some((started, Some(ref phrase))) ) = (*self.clock.playing.read().unwrap(), &self.phrase) { - Some((started.sample(), phrase.clone())) + Some((started.sample().get() as usize, phrase.clone())) } else { None } diff --git a/crates/tek_sequencer/src/sequencer_snd.rs b/crates/tek_sequencer/src/sequencer_snd.rs index 97e429d8..696fbb34 100644 --- a/crates/tek_sequencer/src/sequencer_snd.rs +++ b/crates/tek_sequencer/src/sequencer_snd.rs @@ -18,7 +18,7 @@ impl Audio for PhrasePlayer { self.reset_midi_out_buf(false /* FIXME where did force-reset come from? */); } let has_midi_inputs = self.has_midi_inputs(); - let quant = self.clock.quant(); + let quant = self.clock.quant().get(); if let Some((start_frame, phrase)) = self.playing_phrase() { // Write chunk of phrase to output phrase.read().map(|phrase|{ @@ -58,10 +58,8 @@ impl Audio for PhrasePlayer { let pulse = self.clock.timebase.samples_to_pulse( (frame0 + frame - start_frame) as f64 ); - let quantized = ( - pulse / quant as f64 - ).round() as usize * quant; - let looped = quantized % length; + let quantized = (pulse / quant).round() * quant; + let looped = quantized as usize % length; looped }, message); } diff --git a/crates/tek_sequencer/src/transport.rs b/crates/tek_sequencer/src/transport.rs index 0d661134..3659d235 100644 --- a/crates/tek_sequencer/src/transport.rs +++ b/crates/tek_sequencer/src/transport.rs @@ -5,24 +5,21 @@ pub struct TransportTime { pub timebase: Arc, /// Current moment in time pub instant: Instant, + /// Note quantization factor + pub quant: TimeUnit, + /// Launch quantization factor + pub sync: TimeUnit, /// Playback state pub playing: RwLock>, - /// Note quantization factor - pub quant: AtomicUsize, - /// Launch quantization factor - pub sync: AtomicUsize, } -impl PulsePosition for TransportTime { - #[inline] fn pulse (&self) -> usize { self.instant.pulse() } - #[inline] fn set_pulse (&self, usec: usize) { self.instant.set_pulse(usec); } +impl PulsePosition for TransportTime { + #[inline] fn pulse (&self) -> &TimeUnit { self.instant.pulse() } } -impl Quantize for TransportTime { - #[inline] fn quant (&self) -> usize { self.quant.load(Ordering::Relaxed) } - #[inline] fn set_quant (&self, quant: usize) { self.quant.store(quant, Ordering::Relaxed); } +impl Quantize for TransportTime { + #[inline] fn quant (&self) -> &TimeUnit { &self.quant } } -impl LaunchSync for TransportTime { - #[inline] fn sync (&self) -> usize { self.sync.load(Ordering::Relaxed) } - #[inline] fn set_sync (&self, sync: usize) { self.sync.store(sync, Ordering::Relaxed); } +impl LaunchSync for TransportTime { + #[inline] fn sync (&self) -> &TimeUnit { &self.sync } } /// Stores and displays time-related state. pub struct TransportToolbar { @@ -65,7 +62,7 @@ impl TransportToolbar { Arc::new(TransportTime { playing: Some(TransportState::Stopped).into(), quant: 24.into(), - sync: (timebase.ppq() as usize * 4).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 aade9a60..cc46650b 100644 --- a/crates/tek_sequencer/src/transport_cmd.rs +++ b/crates/tek_sequencer/src/transport_cmd.rs @@ -24,36 +24,30 @@ impl TransportToolbar { Ok(Some(true)) } fn handle_bpm (&mut self, from: &TuiInput) -> Perhaps { - let bpm = self.clock.timebase.bpm(); + let bpm = self.clock.timebase.bpm().get(); match from.event() { - key!(KeyCode::Char(',')) => { self.clock.timebase.set_bpm(bpm - 1.0); }, - key!(KeyCode::Char('.')) => { self.clock.timebase.set_bpm(bpm + 1.0); }, - key!(KeyCode::Char('<')) => { self.clock.timebase.set_bpm(bpm - 0.001); }, - key!(KeyCode::Char('>')) => { self.clock.timebase.set_bpm(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)) } fn handle_quant (&mut self, from: &TuiInput) -> Perhaps { + let quant = self.clock.quant().get() as usize; match from.event() { - key!(KeyCode::Char(',')) => { - self.clock.set_quant(prev_note_length(self.clock.quant())); - }, - key!(KeyCode::Char('.')) => { - self.clock.set_quant(next_note_length(self.clock.quant())); - }, + key!(KeyCode::Char(',')) => { self.clock.quant.set(prev_note_length(quant) as f64); }, + key!(KeyCode::Char('.')) => { self.clock.quant.set(next_note_length(quant) as f64); }, _ => return Ok(None) } return Ok(Some(true)) } fn handle_sync (&mut self, from: &TuiInput) -> Perhaps { + let sync = self.clock.sync().get() as usize; match from.event() { - key!(KeyCode::Char(',')) => { - self.clock.set_quant(prev_note_length(self.clock.sync())); - }, - key!(KeyCode::Char('.')) => { - self.clock.set_quant(next_note_length(self.clock.sync())); - }, + key!(KeyCode::Char(',')) => { self.clock.quant.set(prev_note_length(sync) as f64); }, + key!(KeyCode::Char('.')) => { self.clock.quant.set(next_note_length(sync) as f64); }, _ => return Ok(None) } return Ok(Some(true)) diff --git a/crates/tek_sequencer/src/transport_snd.rs b/crates/tek_sequencer/src/transport_snd.rs index 8bfea929..c9f0bb46 100644 --- a/crates/tek_sequencer/src/transport_snd.rs +++ b/crates/tek_sequencer/src/transport_snd.rs @@ -5,7 +5,7 @@ impl Audio for TransportToolbar { let CycleTimes { current_frames, current_usecs, next_usecs: _, period_usecs: _ } = times; let _chunk_size = scope.n_frames() as usize; let transport = self.transport.as_ref().unwrap().query().unwrap(); - self.clock.instant.set_sample(transport.pos.frame() as usize); + self.clock.instant.sample.set(transport.pos.frame() as f64); if *self.clock.playing.read().unwrap() != Some(transport.state) { self.started = match transport.state { TransportState::Rolling => Some((current_frames as usize, current_usecs as usize)), @@ -18,8 +18,8 @@ impl Audio for TransportToolbar { self.started = None; } self.clock.instant.update_from_usec(match self.started { - Some((_, usecs)) => current_usecs as usize - usecs, - None => 0 + Some((_, usecs)) => current_usecs as f64 - usecs as f64, + None => 0. }); Control::Continue } diff --git a/crates/tek_sequencer/src/transport_tui.rs b/crates/tek_sequencer/src/transport_tui.rs index 13e416aa..4c3a99e1 100644 --- a/crates/tek_sequencer/src/transport_tui.rs +++ b/crates/tek_sequencer/src/transport_tui.rs @@ -20,14 +20,14 @@ impl Content for TransportToolbar { row!( self.focus.wrap(self.focused, TransportToolbarFocus::Bpm, &Outset::X(1u16, { - let bpm = self.clock.timebase.bpm(); + 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! { //"QUANT ", ppq_to_name(self.quant as usize) //})), self.focus.wrap(self.focused, TransportToolbarFocus::Sync, &Outset::X(1u16, row! { - "SYNC ", pulses_to_name(self.clock.sync() as usize) + "SYNC ", pulses_to_name(self.clock.sync().get() as usize) })) ).align_w().fill_x(),