Feat: WIP pattern view redesign
Some checks failed
Deploy Website / deploy (push) Failing after 4m50s
Some checks failed
Deploy Website / deploy (push) Failing after 4m50s
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user