From fec6294c7b9e48ddc696f164b2f1fa0e8e7603f9 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 27 Oct 2024 14:44:02 +0200 Subject: [PATCH] group sample/pulse/usecs into Instant --- crates/tek_core/src/time.rs | 35 ++++++++++++++++++++--- crates/tek_sequencer/src/arranger_snd.rs | 3 ++ crates/tek_sequencer/src/sequencer_snd.rs | 1 - crates/tek_sequencer/src/transport.rs | 24 ++++++---------- 4 files changed, 43 insertions(+), 20 deletions(-) diff --git a/crates/tek_core/src/time.rs b/crates/tek_core/src/time.rs index 939029c8..ea567dd5 100644 --- a/crates/tek_core/src/time.rs +++ b/crates/tek_core/src/time.rs @@ -181,13 +181,13 @@ pub trait Quantize { } #[derive(Debug)] -/// Keeps track of global time units. +/// Defines global temporal resolutions. pub struct Timebase { - /// Samples per second + /// Audio samples per second pub sr: AtomicF64, - /// Beats per minute + /// MIDI beats per minute pub bpm: AtomicF64, - /// Ticks per beat + /// MIDI ticks per beat pub ppq: AtomicF64, } impl Default for Timebase { fn default () -> Self { Self::new(48000f64, 150f64, 96f64) } } @@ -210,6 +210,33 @@ impl PulsesPerQuaver for Timebase { #[inline] fn set_ppq (&self, ppq: f64) { self.ppq.store(ppq, Ordering::Relaxed); } } +#[derive(Debug, Default)] +/// Represents a point in time in all scales +pub struct Instant { + /// Current time in microseconds + pub usec: AtomicUsize, + /// Current time in audio samples + pub sample: AtomicUsize, + /// Current time in MIDI pulses + pub pulse: AtomicF64, +} +impl FramePosition for Instant { + #[inline] fn sample (&self) -> usize { self.sample.load(Ordering::Relaxed) } + #[inline] fn set_sample (&self, sample: usize) { self.sample.store(sample, Ordering::Relaxed); } +} +impl UsecPosition for Instant { + #[inline] fn usec (&self) -> usize { self.usec.load(Ordering::Relaxed) } + #[inline] fn set_usec (&self, usec: usize) { self.usec.store(usec, Ordering::Relaxed); } +} +impl PulsePosition for Instant { + #[inline] fn pulse (&self) -> f64 { self.pulse.load(Ordering::Relaxed) } + #[inline] fn set_pulse (&self, usec: f64) { self.pulse.store(usec, Ordering::Relaxed); } +} +impl PulsePosition for Instant { + #[inline] fn pulse (&self) -> usize { self.pulse.load(Ordering::Relaxed) as usize } + #[inline] fn set_pulse (&self, usec: usize) { self.pulse.store(usec as f64, Ordering::Relaxed); } +} + /// (pulses, name) pub const NOTE_DURATIONS: [(usize, &str);26] = [ (1, "1/384"), diff --git a/crates/tek_sequencer/src/arranger_snd.rs b/crates/tek_sequencer/src/arranger_snd.rs index 1e04e6a7..877cfbea 100644 --- a/crates/tek_sequencer/src/arranger_snd.rs +++ b/crates/tek_sequencer/src/arranger_snd.rs @@ -4,6 +4,9 @@ impl Audio for Arranger { if let Some(ref transport) = self.transport { transport.write().unwrap().process(client, scope); } + //for track in self.arrangement.tracks.iter_mut() { + //track.player.process(client, scope) + //} Control::Continue } } diff --git a/crates/tek_sequencer/src/sequencer_snd.rs b/crates/tek_sequencer/src/sequencer_snd.rs index 855c29e4..4514476d 100644 --- a/crates/tek_sequencer/src/sequencer_snd.rs +++ b/crates/tek_sequencer/src/sequencer_snd.rs @@ -7,7 +7,6 @@ impl Audio for Sequencer { Control::Continue } } - impl Phrase { /// Write a chunk of MIDI events to an output port. pub fn process_out ( diff --git a/crates/tek_sequencer/src/transport.rs b/crates/tek_sequencer/src/transport.rs index 0bb279d9..a2049d9e 100644 --- a/crates/tek_sequencer/src/transport.rs +++ b/crates/tek_sequencer/src/transport.rs @@ -3,14 +3,10 @@ use crate::*; pub struct TransportTime { /// Current sample sr, tempo, and PPQ. pub timebase: Timebase, + /// Current moment in time + pub instant: Instant, /// Playback state pub playing: RwLock>, - /// Current time in samples - pub sample: AtomicUsize, - /// Current time in pulses - pub pulse: AtomicUsize, - /// Current time in microseconds - pub usecs: AtomicUsize, /// Note quantization factor pub quant: AtomicUsize, /// Launch quantization factor @@ -57,16 +53,16 @@ impl PulsesPerQuaver for TransportTime { #[inline] fn set_ppq (&self, ppq: usize) { self.timebase.set_ppq(ppq as f64); } } impl FramePosition for TransportTime { - #[inline] fn sample (&self) -> usize { self.sample.load(Ordering::Relaxed) } - #[inline] fn set_sample (&self, sample: usize) { self.sample.store(sample, Ordering::Relaxed); } + #[inline] fn sample (&self) -> usize { self.instant.sample() } + #[inline] fn set_sample (&self, sample: usize) { self.instant.set_sample(sample) } } impl UsecPosition for TransportTime { - #[inline] fn usec (&self) -> usize { self.usecs.load(Ordering::Relaxed) } - #[inline] fn set_usec (&self, usec: usize) { self.usecs.store(usec, Ordering::Relaxed); } + #[inline] fn usec (&self) -> usize { self.instant.usec() } + #[inline] fn set_usec (&self, usec: usize) { self.instant.set_usec(usec) } } impl PulsePosition for TransportTime { - #[inline] fn pulse (&self) -> usize { self.pulse.load(Ordering::Relaxed) } - #[inline] fn set_pulse (&self, usec: usize) { self.pulse.store(usec, Ordering::Relaxed); } + #[inline] fn pulse (&self) -> usize { self.instant.pulse() } + #[inline] fn set_pulse (&self, usec: usize) { self.instant.set_pulse(usec); } } impl Quantize for TransportTime { #[inline] fn quant (&self) -> usize { self.quant.load(Ordering::Relaxed) } @@ -97,9 +93,7 @@ impl TransportToolbar { playing: Some(TransportState::Stopped).into(), quant: 24.into(), sync: (timebase.ppq() as usize * 4).into(), - sample: 0.into(), - pulse: 0.into(), - usecs: 0.into(), + instant: Instant::default(), timebase, }) }