Neural Interactive Shaping of Parameter Spaces
NISPS lets you teach a neural network how to map a 2D joystick position to a rich set of visual or audio parameters. Move the joystick, shape the outputs you want, and the network learns your preferences in real time.
A small neural network takes your joystick X/Y position as input and produces dozens of output parameters. You teach it by either:
| Touch / Mouse | |
|---|---|
| Drag joystick | Move through parameter space |
| + / − buttons | Positive / negative feedback |
| Bottom bar | Train, Randomize, Clear, Follow mode |
| Keyboard | |
| 1 | Negative feedback (−) |
| 2 | Positive feedback (+) |
| Gamepad (Steam Deck, Xbox, etc.) | |
| Left stick | Joystick control |
| LB (left bumper) | Negative feedback |
| RB (right bumper) | Positive feedback |
| A | Train |
| X | Randomize |
| B | Clear examples |
Toggle to Hands mode in the bottom bar to use your webcam for input.
Send NISPS parameters to any OSC-capable software (SuperCollider, Max/MSP, Pure Data, TouchDesigner, Ableton, etc.) via a small bridge script that runs on your computer.
1. Download the bridge
Binary is standalone, no runtime needed. Source requires Deno or Node.js.
2. Run
./nisps-osc-bridge
3. Connect
In the synth panel below, click Connect next to "OSC Output". The status will show the target address once connected.
Configuration
| --osc-port 9000 | Target port (default: 57120 / SuperCollider) |
| --osc-host 192.168.1.5 | Target IP (default: 127.0.0.1) |
| --osc-prefix /my | Address prefix (default: /nisps) |
| --ws-port 8000 | WebSocket listen port (default: 8765) |
| --bundle | Send OSC bundles instead of individual messages |
OSC addresses
Each parameter is sent as /nisps/<Param_Name> <float 0–1>. All 126 synth parameters are available. Values reflect your current preset, curves, and tame settings. Examples:
/nisps/Env_A_Att 0.35 /nisps/SVF_Flt_Cut 0.72 /nisps/Reverb_Mix 0.15
// Listen for all NISPS params
OSCdef(\nisps, { |msg, time|
msg.postln;
}, '/nisps/*');
// Map a specific param to a synth
OSCdef(\cutoff, { |msg|
~synth.set(\freq, msg[1].linexp(0, 1, 200, 8000));
}, '/nisps/SVF_Flt_Cut');
[netreceive -u -b 57120] | [oscparse] | [route /nisps] | [route /Env_A_Att /SVF_Flt_Cut ...]
[udpreceive 57120] | [OSC-route /nisps/Env_A_Att] | [scale 0. 1. 200. 8000.]