instrument: deliver continuous playback params live to sounding voices via a seqlock block, holding normalized stage position across time edits

This commit is contained in:
2026-07-30 21:03:05 -04:00
parent 7bd911d58b
commit 1dade0bfcf
25 changed files with 1352 additions and 66 deletions
+14
View File
@@ -72,6 +72,20 @@ enum DeckGroupId {
// reservation (knob_deck.h) so a mode flip never reflows the neighbouring groups.
std::vector<DeckGroupDesc> sampleDeckGroups(PlayMode playMode);
// Whether control `id` is delivered LIVE — straight to the voices that are already sounding —
// rather than through an instrument reload. The line is drawn at continuously-valued playback
// controls, so this is a routing decision at the editor's commit site rather than a property
// of any one knob; moving a control across the line is a change here and nowhere else.
//
// Deliberately NOT live, each for its own reason: the discrete toggles (play mode, pitch
// engine, filter enable/law, pitch-envelope enable) name a different sound rather than a
// different setting of one; the three capture-anchored overrides (root, loop span, start
// frame) name positions in the decoded PCM; pitch key-track and the velocity->cutoff depth
// feed values a voice latches at note-on by design (the pitch ratio and the velocity-curve
// result), so making them live would retune or re-gain a note already struck; and Trigger's
// %-length and fades resolve a play span that is a fact about the note.
bool isLiveDeckParam(DeckParam id);
// The deck's BIPOLAR knob law: 0.5 of the knob's travel is zero depth, the ends are -1 and
// +1. Exact inverses, and exact at the centre detent (0.5 -> 0 -> 0.5), so a knob parked at
// centre can never persist a hair of modulation. Out-of-range norm clamps to the endpoints.