The Signal Chain module lets you build patchable chains of MIDI FX, an optional MIDI source, a sound generator, and audio FX.
[Input or MIDI Source] -> [MIDI FX] -> [Sound Generator] -> [Audio FX] -> [Output]
Components live under src/modules/chain/:
midi_fx/: JavaScript MIDI effects registry and implementationssound_generators/: Built-in generators (linein)audio_fx/: Audio effects (freeverb)
Patch JSON files are stored in /data/UserData/move-anything/patches/ on the device.
Example:
{
"name": "Chord Piano",
"version": 1,
"chain": {
"input": "pads",
"midi_source": {
"module": "sequencer"
},
"midi_fx": {
"chord": "major"
},
"synth": {
"module": "sf2",
"config": {
"preset": 0
}
},
"audio_fx": [
{
"type": "freeverb",
"params": {
"room_size": 0.6,
"wet": 0.25,
"dry": 0.75
}
}
]
}
}input controls which MIDI sources the chain accepts:
pads: Move internal pads/controls onlyexternal: external USB MIDI onlyboth/all: allow both sources
If no midi_source is specified, the chain uses input for MIDI as before.
Native MIDI FX supported today:
- Chord:
major,minor,power,octave - Arp:
up,down,up_down,randomwitharp_bpmandarp_division
JavaScript MIDI FX can be attached per patch using midi_fx_js:
"midi_fx_js": ["octave_up"]Available JS MIDI FX live in midi_fx/ (see index.mjs for the registry).
Sound generators can be built-in or external modules. Built-in: linein. External modules that work as chain sound generators include sf2, dexed, minijv, and obxd (plus any other module that is chainable with component_type: "sound_generator").
Audio FX are loaded by type. freeverb is included.
Optional MIDI source modules can generate MIDI without external input.
Example:
{
"chain": {
"midi_source": {
"module": "sequencer"
}
}
}When a MIDI source is active, source-generated MIDI is routed into the chain,
and external/pads input still follows the input filter.
MIDI sources can expose a full-screen UI inside the chain by providing
ui_chain.js (or ui_chain in module.json to point to a different file). The
file should set globalThis.chain_ui = { init, tick, onMidiMessageInternal, onMidiMessageExternal }
and must not override globalThis.init/tick.
Chain will enter the source UI when a patch with a supported source loads. Press Back to return to the chain view, and Menu to re-enter the source UI.
- Jog wheel: highlight patches
- Jog click: load highlighted patch
- Back: return to list (or exit source UI first)
- Up/Down: octave transpose in patch view
By default, the host filters knob-touch notes (0-9) from internal MIDI. To bypass this for Signal Chain, set "raw_midi": true in module.json.
External modules can install chain presets into /data/UserData/move-anything/patches/ via their install scripts (for example Mini-JV and OB-Xd).
This module is part of Move Everything and was developed with AI assistance, including Claude, Codex, and other AI assistants.
All architecture, implementation, and release decisions are reviewed by human maintainers.
AI-assisted content may still contain errors, so please validate functionality, security, and license compatibility before production use.