oscCtrl --- Continuous Control Lanes (OSC)
oscCtrl lets you draw a path in the score and use it as a live
control lane for audio / electronics via OSC. As the playhead passes
over the path, values are mapped and streamed to the audio engine.
The path acts like a breakpoint automation curve tightly aligned to instrumental notation.
Basic Syntax
oscCtrl( addr:"/fx/ring/freq", min:60, max:800, uid:ringModFreq )
Parameters
Param Required Type Description
addr ✔ string OSC address to control
(joined under
/oscilla/control)
min ✖ number Minimum mapped value
(default 0)
max ✖ number Maximum mapped value
(default 1)
uid ✖ string Unique label (client‑side
only, debugging)
mode ✖ enum event (default) or
continuous
The cue must be placed directly on a <path> element.
What gets sent
Given:
addr:"/fx/ring/freq"
Oscilla sends:
/oscilla/control/fx/ring/freq
Where:
- value → mapped Y position between
min→max - t → normalized X position along the path (0--1)
Example:
/oscilla/control/fx/ring/freq 726.06 0.27
Path Semantics
The path defines:
-
horizontal = time alignment with notation
-
vertical = control value
-
Top of path → higher values
-
Bottom of path → lower values
Zoom, scale, and SVG transforms are handled automatically.
Modes
mode:event (default)
Send only when the value changes meaningfully: a message goes out once the value has moved by more than 0.5 % of the lane's min…max range since the last message sent (for min:0, max:0.8 that is 0.004). A slowly moving playhead therefore still streams, just at a lower rate than continuous.
oscCtrl( addr:"/fx/pan", min:-1, max:1 )
Reduces controller spam and CPU noise.
mode:continuous
Send regularly while the playhead is inside the lane:
oscCtrl( addr:"/fx/pan", min:-1, max:1, mode:continuous )
Useful for:
- scrubbing
- FM / modulation
- granular playback positions
Messages are still throttled to ~30/s.
Recommended Uses
✔ ring modulation frequency
✔ panning automation
✔ filter cutoff / resonance
✔ spatialization
✔ cueing electronics transitions
Not Sent
oscCtrl does not apply smoothing.
This should happen in the audio client, where it belongs.
Future Extensions
oscCtrlNode()breakpoint nodes & interpolation- custom easing curves (exp / log)
- curve visualization overlays
Troubleshooting
Nothing happens?
Ensure the cue is attached to the path element itself, not a group.
OSC not received?
Check the server receives:
type: "osc_control"
and that /oscilla/control/* is routed correctly.
Summary
oscCtrl brings automation‑style control inside the score while
remaining modular and OSC‑native.
Compose gestures visually --- let the audio engine interpret.
On the control plane
An oscCtrl() lane publishes as you move it, so it works as a fader inside the
score as well as an OSC sender:
| Channel | Meaning |
|---|---|
t |
position along the lane, 0–1 |
v |
the lane's value, 0–1 |
synth(uid:pad, wave:sine, freq: follow(myLane.t, 90, 2000), amp:0.1)
The two are independent: sending OSC out and driving a cue in the same score are the same movement read twice. Open the connections view to see the ports.
Demo
See demo-osc-send — drawn control lanes streaming OSC as the playhead crosses them.
http://localhost:8001/?project=demo-osc-send
Tip: use ← → or ↑ ↓ to navigate the docs