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

View file

@ -25,11 +25,11 @@ impl Phrase {
frame0: usize, frame0: usize,
frames: usize, frames: usize,
) { ) {
let ticks = timebase.frames_to_ticks( let start = frame0 as f64;
frame0 as f64, let end = start + frames as f64;
(frame0 + frames) as f64, let repeat = timebase.pulses_frames(self.length as f64);
timebase.pulses_frames(self.length as f64) let ticks = timebase.frames_to_ticks(start, end, repeat);
); //panic!("{start} {end} {repeat} {ticks:?}");
for (time, tick) in ticks.iter() { for (time, tick) in ticks.iter() {
let events = self.notes.get(&(*tick as usize)); let events = self.notes.get(&(*tick as usize));
if events.is_none() { if events.is_none() {

View file

@ -69,7 +69,7 @@ fn main () -> Result<(), Box<dyn Error>> {
sample!(44, "Hihat", "/home/user/Lab/Music/pak/chh.wav"), sample!(44, "Hihat", "/home/user/Lab/Music/pak/chh.wav"),
])))?.boxed(), ])))?.boxed(),
Plugin::lv2("Panagement", "file:///home/user/.lv2/Auburn Sounds Panagement 2.lv2")?.boxed(), //Plugin::lv2("Panagement", "file:///home/user/.lv2/Auburn Sounds Panagement 2.lv2")?.boxed(),
]), Some(vec![ ]), Some(vec![