very wip
This commit is contained in:
@@ -87,13 +87,13 @@ pub struct ActivePatternState {
|
||||
#[derive(Clone, Default)]
|
||||
pub struct SharedSequencerState {
|
||||
pub active_patterns: Vec<ActivePatternState>,
|
||||
pub pattern_traces: HashMap<PatternId, Vec<SourceSpan>>,
|
||||
pub step_traces: HashMap<(usize, usize, usize), Vec<SourceSpan>>,
|
||||
pub event_count: usize,
|
||||
}
|
||||
|
||||
pub struct SequencerSnapshot {
|
||||
pub active_patterns: Vec<ActivePatternState>,
|
||||
pub pattern_traces: HashMap<PatternId, Vec<SourceSpan>>,
|
||||
pub step_traces: HashMap<(usize, usize, usize), Vec<SourceSpan>>,
|
||||
pub event_count: usize,
|
||||
}
|
||||
|
||||
@@ -118,8 +118,8 @@ impl SequencerSnapshot {
|
||||
.map(|p| p.iter)
|
||||
}
|
||||
|
||||
pub fn get_trace(&self, bank: usize, pattern: usize) -> Option<&Vec<SourceSpan>> {
|
||||
self.pattern_traces.get(&PatternId { bank, pattern })
|
||||
pub fn get_trace(&self, bank: usize, pattern: usize, step: usize) -> Option<&Vec<SourceSpan>> {
|
||||
self.step_traces.get(&(bank, pattern, step))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ impl SequencerHandle {
|
||||
let state = self.shared_state.lock().unwrap();
|
||||
SequencerSnapshot {
|
||||
active_patterns: state.active_patterns.clone(),
|
||||
pattern_traces: state.pattern_traces.clone(),
|
||||
step_traces: state.step_traces.clone(),
|
||||
event_count: state.event_count,
|
||||
}
|
||||
}
|
||||
@@ -284,6 +284,7 @@ impl RunsCounter {
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn sequencer_loop(
|
||||
cmd_rx: Receiver<SeqCommand>,
|
||||
audio_tx: Sender<AudioCommand>,
|
||||
@@ -301,7 +302,7 @@ fn sequencer_loop(
|
||||
let mut audio_state = AudioState::new();
|
||||
let mut pattern_cache = PatternCache::new();
|
||||
let mut runs_counter = RunsCounter::new();
|
||||
let mut pattern_traces: HashMap<PatternId, Vec<SourceSpan>> = HashMap::new();
|
||||
let mut step_traces: HashMap<(usize, usize, usize), Vec<SourceSpan>> = HashMap::new();
|
||||
let mut event_count: usize = 0;
|
||||
|
||||
loop {
|
||||
@@ -360,13 +361,15 @@ fn sequencer_loop(
|
||||
}
|
||||
for id in audio_state.pending_stops.drain(..) {
|
||||
audio_state.active_patterns.remove(&id);
|
||||
pattern_traces.remove(&id);
|
||||
step_traces.retain(|&(bank, pattern, _), _| {
|
||||
bank != id.bank || pattern != id.pattern
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let prev_beat = audio_state.prev_beat;
|
||||
|
||||
for (id, active) in audio_state.active_patterns.iter_mut() {
|
||||
for (_id, active) in audio_state.active_patterns.iter_mut() {
|
||||
let Some(pattern) = pattern_cache.get(active.bank, active.pattern) else {
|
||||
continue;
|
||||
};
|
||||
@@ -391,7 +394,6 @@ fn sequencer_loop(
|
||||
let ctx = StepContext {
|
||||
step: step_idx,
|
||||
beat,
|
||||
bank: active.bank,
|
||||
pattern: active.pattern,
|
||||
tempo,
|
||||
phase: beat % quantum,
|
||||
@@ -406,8 +408,10 @@ fn sequencer_loop(
|
||||
if let Ok(cmds) =
|
||||
script_engine.evaluate_with_trace(script, &ctx, &mut trace)
|
||||
{
|
||||
pattern_traces
|
||||
.insert(*id, std::mem::take(&mut trace.selected_spans));
|
||||
step_traces.insert(
|
||||
(active.bank, active.pattern, step_idx),
|
||||
std::mem::take(&mut trace.selected_spans),
|
||||
);
|
||||
for cmd in cmds {
|
||||
match audio_tx.try_send(AudioCommand::Evaluate(cmd)) {
|
||||
Ok(()) => {
|
||||
@@ -450,7 +454,7 @@ fn sequencer_loop(
|
||||
iter: a.iter,
|
||||
})
|
||||
.collect();
|
||||
state.pattern_traces = pattern_traces.clone();
|
||||
state.step_traces = step_traces.clone();
|
||||
state.event_count = event_count;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user