Feat: WIP pattern view redesign
Some checks failed
Deploy Website / deploy (push) Failing after 4m50s

This commit is contained in:
2026-02-22 03:26:48 +01:00
parent 52406c7374
commit 003ee0518e
9 changed files with 636 additions and 127 deletions

View File

@@ -149,6 +149,7 @@ pub struct ActivePatternState {
pub pattern: usize,
pub step_index: usize,
pub iter: usize,
pub last_step_beat: f64,
}
pub type StepTracesMap = HashMap<(usize, usize, usize), ExecutionTrace>;
@@ -208,6 +209,19 @@ impl SequencerSnapshot {
.map(|p| p.step_index)
}
/// Returns smooth progress (0.0..1.0) through the pattern by interpolating
/// between discrete steps using beat timing.
pub fn get_smooth_progress(&self, bank: usize, pattern: usize, length: usize, speed_mult: f64) -> Option<f64> {
let p = self.active_patterns.iter().find(|p| p.bank == bank && p.pattern == pattern)?;
if length == 0 || self.tempo <= 0.0 {
return Some(0.0);
}
let step_duration_beats = 1.0 / (4.0 * speed_mult);
let elapsed = (self.beat - p.last_step_beat).max(0.0);
let phase = (elapsed / step_duration_beats).clamp(0.0, 1.0);
Some((p.step_index as f64 + phase) / length as f64)
}
pub fn get_iter(&self, bank: usize, pattern: usize) -> Option<usize> {
self.active_patterns
.iter()
@@ -260,6 +274,7 @@ struct ActivePattern {
pattern: usize,
step_index: usize,
iter: usize,
last_step_beat: f64,
}
#[derive(Clone, Copy)]
@@ -821,6 +836,7 @@ impl SequencerState {
pattern: pending.id.pattern,
step_index: start_step,
iter: 0,
last_step_beat: beat,
},
);
self.buf_activated.push(pending.id);
@@ -902,6 +918,7 @@ impl SequencerState {
for step_beat in step_beats {
result.any_step_fired = true;
active.last_step_beat = step_beat;
let step_idx = active.step_index % pattern.length;
let beat_delta = step_beat - beat;
@@ -1099,6 +1116,7 @@ impl SequencerState {
pattern: a.pattern,
step_index: a.step_index,
iter: a.iter,
last_step_beat: a.last_step_beat,
})
.collect(),
step_traces: Arc::clone(&self.step_traces),