Skip to content

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. Modulation
3. Palette
4. Slider (stored)
5. ParamDef default ← lowest

Layer summary

TierLayerWhen it’s activeNotes
1MIDI CCA MIDI control is bound to the parameterTakes over completely. Unbind to release.
2ModulationAt least one enabled mod slot targets the parameterMultiple slots stack — last slot wins.
3PaletteThe parameter has a colorGroup and a swatch channelOnly affects colour params (colorRole h/s/b).
4Slider (stored)Always, as the base valueYour drags update this, even when a higher layer hides them.
5ParamDef defaultFallback if the stored value is missingComes from ParamDefs.ts in the engine package.

Implementation pipeline

store → palette overlay → modulation overlay → MIDI write → render

Each 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-Off on 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.