memlnaut-nisps/manifold/src
monkey-w1n5t0n ae2657a01b refactor(manifold): one applyCurve, one GROUP_COLOR — and make the knob honest
Phase 3 (L38, ST4).

L38 is a REAL, VISIBLE behaviour change, and it is a bug fix rather than a wash.
There were two divergent applyCurve implementations: model.ts's
(`e = 0.25 + c*1.75`, linear at c≈0.43) drove the on-screen bars, while
mapping.ts's spec-anchored version (0.5 = exactly linear, symmetric in
log-exponent space) drove `mapOutput` — i.e. the value actually sent to MIDI/OSC/
VCV. So the display disagreed with the signal at every curve setting except the
shared endpoint. mapping.ts's survives; model.ts's is deleted and re-exported.
Displayed values now move visibly, and they now match what is transmitted.

That unification exposed a third copy the finding did not mention: CurvePad.tsx
inlined the same deleted formula to draw the curve-knob preview and its numeric
readout. Left alone it would have matched NEITHER implementation — the knob
would have drawn one response while the bars and the output used another.
CurvePad now calls the same applyCurve, so knob, bars and transmitted value are
one thing. The readout shows the actual exponent.

ST4: GROUP_COLOR was duplicated across four files (Phase 1's ReadoutStrip
deletion removed a fifth). All four now import the single map in model.ts —
including OutputStage.tsx's OUT_GROUP_COLOR, which was outside the sweep's scope
and would have been the last survivor.

NOT done, deliberately: ST4 also invited replacing the fixed map with a
hash-to-palette function, because its keys (formant/pitch/amp/filter/fx/mod) are
JSX-era placeholders that do not match the real schema group strings
(verb/sequencer/general/filterbank/delays/eq/midi/...), so most groups currently
fall through to the accent colour. That is a visual redesign, not a
deduplication, and it should be one deliberate change now that every consumer
reads one map.

Gates: typecheck clean, 17/17 unit tests, 33 e2e specs.
2026-07-21 14:02:48 +02:00
..
backends refactor(manifold): extract BaseBackend mirroring the input layer's BaseSource 2026-07-21 14:02:48 +02:00
console refactor(manifold): one applyCurve, one GROUP_COLOR — and make the knob honest 2026-07-21 14:02:48 +02:00
debug feat(manifold): geometric dislike + jolt/OU via shared core (one-core-engine P3) 2026-07-14 04:54:27 +02:00
dock refactor(manifold): one applyCurve, one GROUP_COLOR — and make the knob honest 2026-07-21 14:02:48 +02:00
engine fix(manifold): full-width input vector, dropped switches, MIDI churn, re-subscribe churn 2026-07-21 13:22:38 +02:00
feedback refactor(manifold): delete the dead console UI stratum 2026-07-21 12:49:25 +02:00
inputs fix(manifold): full-width input vector, dropped switches, MIDI churn, re-subscribe churn 2026-07-21 13:22:38 +02:00
midi-devices feat(manifold): MIDI device-template picker in Outputs config 2026-06-28 20:06:15 +02:00
modes/generated refactor(codegen): codegen owns mode identity, per-mode schemas and net dims 2026-07-21 14:02:23 +02:00
primitives refactor(manifold): delete the dead console UI stratum 2026-07-21 12:49:25 +02:00
serial feat(manifold,firmware): restore uSEQ CV/gate as an Outputs backend 2026-06-28 22:30:54 +02:00
settings feat(manifold): add convertible React front-end + simplify console chrome 2026-06-28 03:28:45 +02:00
styles refactor(manifold): delete the dead console UI stratum 2026-07-21 12:49:25 +02:00
App.tsx refactor(manifold): delete the dead console UI stratum 2026-07-21 12:49:25 +02:00
main.tsx feat(manifold): add convertible React front-end + simplify console chrome 2026-06-28 03:28:45 +02:00