memlnaut-nisps/schemas/midi_devices
2026-06-28 20:16:48 +02:00
..
asm_hydrasynth.json feat(midi-devices): canonical external-synth CC templates + dual codegen 2026-06-28 20:03:17 +02:00
creamware_pro12_asb.json feat(midi-devices): canonical external-synth CC templates + dual codegen 2026-06-28 20:03:17 +02:00
elektron_analog_keys.json feat(midi-devices): canonical external-synth CC templates + dual codegen 2026-06-28 20:03:17 +02:00
moog_sub37.json feat(midi-devices): canonical external-synth CC templates + dual codegen 2026-06-28 20:03:17 +02:00
moog_sub_phatty.json feat(midi-devices): canonical external-synth CC templates + dual codegen 2026-06-28 20:03:17 +02:00
README.md docs(midi-devices): workshop usage + pipeline README 2026-06-28 20:16:48 +02:00
roland_jd800.json feat(midi-devices): canonical external-synth CC templates + dual codegen 2026-06-28 20:03:17 +02:00

MIDI device templates

Canonical, committed source of truth for controlling external hardware synths over MIDI CC from NISPS — ingested by both the RP2350 firmware and the Manifold browser engine from one set of files.

Files

  • ../midi_device.schema.json — Draft 2020-12 meta-schema (validated by codegen).
  • <device>.json — one template per device. Each param: { id, cc, label, min, max, default, group }label is what humans see, cc is the MIDI Control Change number, group is a coarse UI section.
  • Verified CC provenance + sources for every device live in ../../synth-midi-cc.json.

Currently shipped (CC-controllable): moog_sub37, moog_sub_phatty, creamware_pro12_asb, elektron_analog_keys, asm_hydrasynth, roland_jd800.

Regenerate after editing

bun run codegen/generate-midi-devices.ts

Emits (do not hand-edit the outputs):

  • nisps/midi/generated/midi_devices.hpp — no-heap constexpr (firmware + WASM).
  • manifold/src/midi-devices/generated/ — typed catalogue for the browser.

Idempotent. To (re)derive these files from the research artifact: bun run codegen/seed-midi-devices.ts.

Using it

Browser (Manifold, live at /next/): Outputs drawer → MIDI backend → Device template → pick a synth → tick the parameters to control → Apply. This fills the per-output CC table (CC#/channel/name) and the CC count; the result is savable via the named-preset bar. Parameters are shown by name, not CC number.

Firmware: one flashable variant per device. The model maps the joystick to a curated 8-param subset (pick_cc_slots prefers musical params over Bank Select / housekeeping CCs). Build + flash, e.g.:

scripts/build-and-flash-firmware.sh ExtSynthSub37
# others: ExtSynthSubPhatty ExtSynthPro12 ExtSynthAnalogKeys ExtSynthHydrasynth ExtSynthJD800

Set the synth to receive on the template's default_channel (1 by default).

Notes / caveats

  • default is a neutral midpoint (64); it's only sent when a param is fixed, not when the model is driving it live.
  • The firmware drives 8 params; the browser can drive as many as the engine has outputs. To change the firmware's default subset for a device, reorder/curate that device's params (or its groups) and regenerate — pick_cc_slots takes the first non-global params.
  • Roland JD-800 only receives a small CC set (its panel sliders emit SysEx); Korg Polysix and the Behringer "RD-9" are intentionally excluded (no usable CC).