No description
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. |
||
|---|---|---|
| .github/workflows | ||
| .vscode | ||
| assets/media | ||
| codegen | ||
| docs | ||
| firmware | ||
| manifold | ||
| nisps | ||
| schemas | ||
| scripts | ||
| src | ||
| tests/cpp | ||
| vcv | ||
| .envrc | ||
| .gitignore | ||
| .gitmodules | ||
| AGENTS.md | ||
| ALIGNMENT.md | ||
| CLAUDE.md | ||
| LICENSE | ||
| MAP.md | ||
| README.md | ||
| synth-midi-cc.json | ||
Neural Interactive Shaping of Parameter Spaces
https://musicallyembodiedml.github.io/memlnaut/approaches/nisps
Firmware
The hardware firmware targets the MEMLNaut RP2350 build and uses repo-local helper scripts for the known-good build configuration:
git submodule update --init --recursive
scripts/build-firmware.sh
scripts/flash-firmware.sh
scripts/build-and-flash-firmware.sh
Notes:
- The scripts build for
rp2040:rp2040:solderparty_rp2350_stamp_xlwithOptimize3. - The build forces C++20 because the firmware uses
std::spanand concepts. build-firmware.shaccepts an optional variant name such asMEMLCeliumorBreakOr. Matching remains case-insensitive, somemlceliumstill works. If you omit it in an interactive shell, the script parsesMEMLNaut-NISPS.ino, prompts for a variant, and rewrites the activeMEMLNAUT_MODE_TYPEbefore building.flash-firmware.shaccepts an optional mountpoint argument, or auto-detects common UF2 bootloader mounts such as/run/media/$USER/RP2350and/run/media/$USER/RPI-RP2.
Manifold (browser app)
Try NISPS in your browser — no hardware required. Manifold is the React front-end running the same C++ engines + ML as the firmware, compiled to WASM:
cd manifold
bun install
bun run dev
Staging deployment: https://meml.lnfinitemonkeys.org/next/
Train a neural network to map input gestures to synth parameters through interactive machine learning: place examples, or use verdict-based feedback (explore-and-place, geometric dislike).
(The former SolidJS playground was retired in July 2026 — archived on branch
archive/playground-solidjs, tag playground-solidjs-final.)