No description
Find a file
monkey-w1n5t0n c19d84619e feat(firmware): bump memllib to current upstream and dissolve the fork
The §7.5 decision was "rebase our commits onto upstream, then vendor". On
inspection there was no rebase to do, and the inventory that recommended it
(7a30da9) was wrong on two counts — both corrected in this commit.

All three fork commits touch only `examples/`. That directory is not in the
sketch symlink forest (firmware/MEMLNaut-NISPS/src/ links exactly audio,
hardware, interface, synth, utils, PicoDefs.hpp), so it is never compiled.
They existed to let the RL code build against nisps/core *while it was being
ported*, and that port is done — nisps/ml/{jolt,ou_noise,feedback,geo_push}.hpp
cite the upstream sources directly. Two of the 31 commits I flagged as
"work we are missing", `9fcd459 jolts` and `d0d8a72 noise`, are precisely the
ones already absorbed.

So the question was never rebase-or-not but which snapshot to vendor. Current
upstream, because the staleness was already costing us:

  - upstream has DisplayDriver::NavigateToView; the pin does not. The SelfTest
    variant called it and had been failing to compile (worked around in
    b953681). It was written against a newer memllib, not against nothing.
  - e291192 "l r input swap" is a hardware bug fix: the physical L/R input
    sockets are wired to opposite codec ADC channels. Every mode on the old
    pin sees its stereo input backwards.

Verified by building all three variants with arduino-cli:

  SLPWorkshop  145348 flash (+320)  87388 RAM (+4)
  PAFSynth     145300 flash (+312) 107060 RAM (+4)
  SelfTest     141840 flash (+320)  12028 RAM (+4)

Exactly one compile error: the .ino used kSampleRate in a constexpr, and
upstream 1997699 made it a runtime `extern size_t` so a mode can pick its own
rate. constexpr -> const; it is a once-per-second diagnostic print. The uniform
+316 is the AudioDriver/DisplayDriver deltas — the bulky new upstream code
(GrainDelayI16, ReverbI16, ModFXI16, CCSelectView, RLView, VUMeterView,
PSRAMManager) is header-only and unreferenced, so the linker drops all of it.

.gitmodules points at upstream again: with the pin on an upstream commit, the
fork holds nothing the firmware compiles. Phase 0 pointed it at the fork only
because b37fc53 existed on no remote. The fork's feat/nisps-core-swap branch
stays pushed; nothing is destroyed.

Refs: plan §5, §7.5; ALIGNMENT Q4.
2026-07-21 17:04:10 +02:00
.github/workflows chore: delete retired-playground artefacts and root relics 2026-07-21 12:47:58 +02:00
.vscode memlnautmodes, channelstrip 2025-11-19 15:17:37 +00:00
assets/media docs: restructure design docs into docs/specs (adr/plans/recon), update path references 2026-07-13 23:15:46 +03:00
codegen chore(schemas): retire the clobbering seed script; fix the direction-of-truth text 2026-07-21 14:03:07 +02:00
docs feat(firmware): bump memllib to current upstream and dissolve the fork 2026-07-21 17:04:10 +02:00
firmware feat(firmware): bump memllib to current upstream and dissolve the fork 2026-07-21 17:04:10 +02:00
manifold refactor(manifold): one applyCurve, one GROUP_COLOR — and make the knob honest 2026-07-21 14:02:48 +02:00
nisps refactor(engines): extract the shared sequencer machinery 2026-07-21 14:02:23 +02:00
schemas chore(schemas): retire the clobbering seed script; fix the direction-of-truth text 2026-07-21 14:03:07 +02:00
scripts fix(gates): close the no-heap lint's false negatives and parity's silent FAIL 2026-07-21 13:23:11 +02:00
src feat(firmware): bump memllib to current upstream and dissolve the fork 2026-07-21 17:04:10 +02:00
tests/cpp refactor(engines): extract the shared sequencer machinery 2026-07-21 14:02:23 +02:00
vcv fix(vcv): close the audio-thread race and remove JSON from process() 2026-07-21 13:23:11 +02:00
.envrc chore: add .envrc + playground package-lock 2026-06-28 04:14:30 +02:00
.gitignore feat(manifold)!: P1 — retire playground/, manifold is the sole browser app 2026-07-13 23:27:56 +02:00
.gitmodules feat(firmware): bump memllib to current upstream and dissolve the fork 2026-07-21 17:04:10 +02:00
AGENTS.md docs+ci: P5 doc sync; codegen golden wired into run-all-tests stage 5 2026-07-18 12:45:45 +02:00
ALIGNMENT.md feat(firmware): bump memllib to current upstream and dissolve the fork 2026-07-21 17:04:10 +02:00
CLAUDE.md chore(agents): converge project instructions 2026-07-13 22:58:26 +02:00
LICENSE Initial commit 2025-04-10 14:17:18 +01:00
MAP.md docs: sync MAP with Phase 3; burn down plan §4 and hand S26 to the operator 2026-07-21 14:03:16 +02:00
README.md feat(manifold)!: P1 — retire playground/, manifold is the sole browser app 2026-07-13 23:27:56 +02:00

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_xl with Optimize3.
  • The build forces C++20 because the firmware uses std::span and concepts.
  • build-firmware.sh accepts an optional variant name such as MEMLCelium or BreakOr. Matching remains case-insensitive, so memlcelium still works. If you omit it in an interactive shell, the script parses MEMLNaut-NISPS.ino, prompts for a variant, and rewrites the active MEMLNAUT_MODE_TYPE before building.
  • flash-firmware.sh accepts an optional mountpoint argument, or auto-detects common UF2 bootloader mounts such as /run/media/$USER/RP2350 and /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.)