fix slooo

This commit is contained in:
🪞👃🪞 2024-07-02 16:59:58 +03:00
parent 2f96897d39
commit e30dd94d23
3 changed files with 29 additions and 13 deletions

View file

@ -13,35 +13,50 @@ impl Timebase {
pub fn new (rate: f64, bpm: f64, ppq: f64) -> Self {
Self { rate: rate.into(), bpm: bpm.into(), ppq: ppq.into() }
}
/// Frames per second
#[inline] fn rate (&self) -> f64 {
self.rate.load(Ordering::Relaxed)
}
/// Usec per frame
#[inline] fn frame_usec (&self) -> f64 {
1_000_000 as f64 / self.rate() as f64
}
/// Frames to usecs
#[inline] pub fn frames_usecs (&self, frame: f64) -> f64 {
frame * self.frame_usec()
}
/// Beats per minute
#[inline] pub fn bpm (&self) -> f64 {
self.bpm.load(Ordering::Relaxed)
}
/// Usec per beat
#[inline] fn beat_usec (&self) -> f64 {
60_000_000f64 / self.bpm() as f64
}
/// Pulses per beat
#[inline] pub fn ppq (&self) -> f64 {
self.ppq.load(Ordering::Relaxed)
}
/// Usec per pulse
#[inline] fn pulse_usec (&self) -> f64 {
self.beat_usec() / self.ppq() as f64
}
/// Pulses per frame
#[inline] pub fn pulse_frame (&self) -> f64 {
self.pulse_usec() / self.frame_usec() as f64
}
/// Frames per pulse
#[inline] pub fn frame_pulse (&self) -> f64 {
self.frame_usec() as f64 / self.pulse_usec()
}
/// Frames to pulses
#[inline] pub fn pulses_frames (&self, pulses: f64) -> f64 {
self.pulse_frame() * pulses
}
/// Pulses to frames
#[inline] pub fn frames_pulses (&self, frames: f64) -> f64 {
frames / self.pulse_frame()
}
@ -88,13 +103,14 @@ impl Timebase {
}
pub fn frames_to_ticks (
&self,
start: f64,
end: f64,
quant: f64,
start: f64,
end: f64,
repeat: f64,
) -> Vec<(usize, usize)> {
let start_frame = start % quant;
let end_frame = end % quant;
let fpt = self.frames_per_tick();
let start_frame = start % repeat;
let end_frame = end % repeat;
let fpt = self.pulse_frame();
//panic!("{start_frame} {end_frame} {fpt}");
let mut ticks = vec![];
let mut add_frame = |frame: f64|{
let jitter = frame.rem_euclid(fpt);
@ -113,7 +129,7 @@ impl Timebase {
loop {
add_frame(frame as f64);
frame = frame + 1;
if frame >= quant as usize {
if frame >= repeat as usize {
frame = 0;
loop {
add_frame(frame as f64);