Add a durable, committed source of truth for external MIDI synth control:
- synth-midi-cc.json: verified CC maps + provenance/sources (8 devices researched)
- schemas/midi_device.schema.json + schemas/midi_devices/*.json: 6 CC-controllable
device templates (Moog Sub 37/Sub Phatty, Creamware Pro-12 ASB, Elektron Analog
Keys, ASM Hydrasynth, Roland JD-800), params keyed {id, cc, label, min, max,
default, group}.
- codegen/generate-midi-devices.ts (isolated from the mode golden test) emits both
nisps/midi/generated/midi_devices.hpp (no-heap constexpr, firmware+WASM) and
manifold/src/midi-devices/generated/ (typed catalogue for the browser).
- codegen/seed-midi-devices.ts: reproducible seed from the research artifact.
Lets a performer pick a device and address its parameters by name (not CC number)
on both the firmware and the Manifold browser engine.
133 lines
2.5 KiB
JSON
133 lines
2.5 KiB
JSON
{
|
|
"$schema": "../midi_device.schema.json",
|
|
"device_id": "roland_jd800",
|
|
"name": "Roland JD-800",
|
|
"manufacturer": "Roland",
|
|
"year": 1991,
|
|
"midi": {
|
|
"default_channel": 1,
|
|
"value_range": [
|
|
0,
|
|
127
|
|
]
|
|
},
|
|
"params": [
|
|
{
|
|
"id": "modulation",
|
|
"cc": 1,
|
|
"label": "Modulation",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "mod"
|
|
},
|
|
{
|
|
"id": "breath_controller",
|
|
"cc": 2,
|
|
"label": "Breath Controller",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
},
|
|
{
|
|
"id": "portamento_time",
|
|
"cc": 5,
|
|
"label": "Portamento Time",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "osc"
|
|
},
|
|
{
|
|
"id": "data_entry_msb",
|
|
"cc": 6,
|
|
"label": "Data Entry MSB (RPN; receive only)",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
},
|
|
{
|
|
"id": "volume_part_level",
|
|
"cc": 7,
|
|
"label": "Volume / Part Level",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "mix"
|
|
},
|
|
{
|
|
"id": "pan",
|
|
"cc": 10,
|
|
"label": "Pan",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "mix"
|
|
},
|
|
{
|
|
"id": "expression",
|
|
"cc": 11,
|
|
"label": "Expression",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
},
|
|
{
|
|
"id": "hold_sustain_pedal",
|
|
"cc": 64,
|
|
"label": "Hold / Sustain Pedal",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "env"
|
|
},
|
|
{
|
|
"id": "portamento_on_off",
|
|
"cc": 65,
|
|
"label": "Portamento On/Off",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "osc"
|
|
},
|
|
{
|
|
"id": "rpn_lsb",
|
|
"cc": 100,
|
|
"label": "RPN LSB (receive only)",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
},
|
|
{
|
|
"id": "rpn_msb",
|
|
"cc": 101,
|
|
"label": "RPN MSB (receive only)",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
},
|
|
{
|
|
"id": "reset_all_controllers",
|
|
"cc": 121,
|
|
"label": "Reset All Controllers (receive only)",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
},
|
|
{
|
|
"id": "all_notes_off",
|
|
"cc": 123,
|
|
"label": "All Notes Off (receive only)",
|
|
"min": 0,
|
|
"max": 127,
|
|
"default": 64,
|
|
"group": "global"
|
|
}
|
|
]
|
|
}
|