{SOLO_DESC[ctx.soloMode]} Solo only freezes the rest as far as a shared network allows. + The other two behaviours need real core support (`train_masked`) and aren't selectable yet.
- The active engine follows the selected mode ({ctx.mode.label}). - {/* TODO(dock-spec §5): arpeggiator + tiered synth presets + the - 18-section group-override matrix are workstream E. */} -
- > ++ The active engine follows the selected mode ({ctx.mode.label}). + {/* TODO(dock-spec §5): arpeggiator + tiered synth presets + the + 18-section group-override matrix are workstream E. Master + volume + bpm sliders were deleted (simplification audit + S16) — they drove no engine parameter. */} +
)} > ); @@ -624,7 +615,6 @@ function RoutingDrawer(ctx: ConsoleCtx, depth: DrawerDepth) { }, {}); const mutedN = ctx.params.filter((p) => p.muted).length; const modeDesc = outputModeDescriptor(ctx.outputMode); - const backend = BACKENDS.find((b) => b.id === modeDesc.backend) ?? BACKENDS[0]; // The particle Mode names its outputs; otherwise use the param names. const nameFor = (idx: number, fallback: string) => ctx.outputMode === 'particles' ? VISUAL_NAMES[idx] ?? fallback : fallback; @@ -671,12 +661,6 @@ function RoutingDrawer(ctx: ConsoleCtx, depth: DrawerDepth) { {!expanded && ctx.params.length > 6 && ( +{ctx.params.length - 6} more — expand to edit )} - {expanded && ( - <> -- {params.length} CCs · live Web MIDI out (backends-spec §2.3). Editing the CC map here sends in - real time once a MIDI port is selected in the Outputs panel. -
-| Name | -CC# | -Ch | -State | -
|---|---|---|---|
| - setParam(i, { midi: { ...m, name: e.target.value } })} - /> - | -- - setParam(i, { - midi: { ...m, cc: Math.max(0, Math.min(127, num(e.target.value, m.cc))) }, - }) - } - /> - | -- - setParam(i, { - midi: { - ...m, - channel: Math.max(1, Math.min(16, num(e.target.value, m.channel))), - }, - }) - } - /> - | -- {p.status} - {p.muted ? ' · muted' : ''} - | -
- Live OSC over the WebSocket bridge (backends-spec §2.4). Set the bridge URL + per-output paths in - the Outputs panel; emits only while the bridge process is connected. -
-| OSC path | -range min | -range max | -
|---|---|---|
| - setParam(i, { osc: { ...o, path: e.target.value } })} - /> - | -- setParam(i, { osc: { ...o, rangeMin: num(e.target.value, o.rangeMin) } })} - /> - | -- setParam(i, { osc: { ...o, rangeMax: num(e.target.value, o.rangeMax) } })} - /> - | -
- VCV adds nothing beyond the baseline (min/max = range, fixed = freeze) plus per-channel polarity. - {/* TODO(backends-spec §2.6): the VCV browser↔module bridge transport is not yet wired here. */} -
-- Live CV/gate over USB serial to a uSEQ module + expander (docs/specs/useq-cv-protocol.md). Assign each model output to a - CV jack or gate; gates threshold the mapped 0–1 value. Connect the device in the Outputs panel. -
-| Output | -uSEQ channel | -Gate ≥ | -
|---|---|---|
| {p.name} | -- - | -- - setParam(i, { - cv: { ...c, gateThreshold: Math.max(0, Math.min(1, num(e.target.value, c.gateThreshold))) }, - }) - } - /> - | -
- The synth backend's advanced surface is the group-override matrix — see the Powerful Synth Engine - drawer's full depth (dock-spec §4.4 / §5). Groups: {groups.join(' · ')}. -
-
- {items.map((it, i) => {
- const isObj = it !== null && typeof it === 'object';
- const toneColor =
- isObj && it.tone ? (TONE_COLORS[it.tone] ?? null) : null;
- return (
-