Parameter Priority
Every parameter’s final render value comes from exactly one layer — the highest active layer wins.
Precedence order
1. MIDI CC ← highest (if bound, wins)2. Modulation3. Palette4. Slider (stored)5. ParamDef default ← lowestLayer summary
| Tier | Layer | When it’s active | Notes |
|---|---|---|---|
| 1 | MIDI CC | A MIDI control is bound to the parameter | Takes over completely. Unbind to release. |
| 2 | Modulation | At least one enabled mod slot targets the parameter | Multiple slots stack — last slot wins. |
| 3 | Palette | The parameter has a colorGroup and a swatch channel | Only affects colour params (colorRole h/s/b). |
| 4 | Slider (stored) | Always, as the base value | Your drags update this, even when a higher layer hides them. |
| 5 | ParamDef default | Fallback if the stored value is missing | Comes from ParamDefs.ts in the engine package. |
Implementation pipeline
store → palette overlay → modulation overlay → MIDI write → renderEach overlay runs per-frame. Overlays return the original array reference if nothing changed (structural sharing), so unmodified parameters cost nothing. Overlays only push a new value when the change exceeds 1e-5 (delta gating).
Common “why isn’t my slider working?” causes
- A modulation icon is active next to the slider → modulation is overriding it.
- A palette channel chip is non-
Offon a colour param → palette is overriding it. - A MIDI binding label is shown on the slider → MIDI is overriding it.
- All three can be present simultaneously. MIDI still wins.
Related
- Parameter Priority concept — the full explainer with worked examples and rationale.
- The Modulation System — how tier 2 values are produced.
- The Palette System — how tier 3 values are produced.