OSC

Modulaser supports Open Sound Control (OSC) input and output over UDP. You can map any OSC address to any parameter (clip controls, output settings, BPM, cues, timecode) and get value feedback sent back to your controller.

OSC shares the same control infrastructure as MIDI, so the learn flow and mapping targets work the same way.

Enabling OSC

Open Preferences and enable OSC Input. Set the UDP port you want Modulaser to listen on. Optionally enable OSC Output and configure a feedback address if you want parameter values sent back to your controller.

When OSC is enabled, Modulaser advertises itself on the local network via mDNS (_osc._udp). Controllers that support ZeroConf/Bonjour (TouchOSC, Lemur, Max/MSP) can discover Modulaser automatically without manual IP/port entry.

Starter Templates

Modulaser ships with ready-to-use control surface layouts for both TouchOSC and Open Stage Control. Both share a four-page layout, pre-wired to the default address scheme:

  • Master: output color presets, color faders, speed, blackout, BPM with live readout, tap, resync
  • Cue: play/pause, prev/next, stop, loop, and a 4×4 jump-to-cue grid
  • Timecode: play/pause, skip back/forward, stop, seek
  • Clips: 8×8 clip-select grid with feedback, 6 macro faders, and 4 output-group strips with opacity, send, and clear

TouchOSC template, Master and Clips pages side by side

Downloads:

OSC Learn

OSC learn works just like MIDI learn. Open Shortcuts → Edit OSC in the menu. All mappable controls show a green overlay.

  1. Click a control in Modulaser to select it as the target
  2. Send an OSC message from your controller
  3. The mapping is created and saved automatically

The learn window shows the assigned address, the default address (if one exists), and range sliders for continuous parameters. Click Clear to remove a mapping.

Only one learn mode can be active at a time. Enabling OSC learn disables MIDI learn and vice versa.

Default Addresses

Modulaser has a built-in address scheme that works without any manual mapping. Addresses are case-insensitive.

Clip Parameters

Clip addresses target the currently selected clip and layer. The general pattern is /clip/{category}/{parameter}. Macros are the exception: they're clip-level and work without a layer selection.

PatternExampleWhat it controls
/clip/{axis}/{param}/clip/x/cyclesX, Y, or Z oscillator
/clip/color/{param}/clip/color/hueColor (hue, saturation, lightness, value)
/clip/transform/{param}/clip/transform/rotationTransform (scale, shift, rotation)
/clip/duplicator/{param}/clip/duplicator/amountDuplicator
/clip/camera/{param}/clip/camera/panCamera
/clip/file/{param}/clip/file/speedILDA file playback
/clip/shape/{param}/clip/shape/sizeShape generator
/clip/dotter/{param}/clip/dotter/countDotter
/clip/text/{param}/clip/text/spacingText
/clip/chase/{param}/clip/chase/widthChase
/clip/{type}/{pos}/{param}/clip/osc/1/cyclesModulators (osc, audio, env, seq)
/clip/noise/{index}/{param}/clip/noise/0/detailNoise modulators
/clip/{axis}phasor/{param}/clip/xphasor/offsetPhasors (x, y, z, dotter, shape, chase)
/clip/macro/{1-6}/clip/macro/1Macro links
/clip/layer/{index}/{param}/clip/layer/0/opacityLayer (select, opacity, visible)
/clip/select/{row}/{col}/clip/select/0/2Clip selection

Available Parameters

CategoryParameters
Oscillator (x/y/z)cycles, speed, level, phase, exponent, pulsewidth, spread
Colorhue, saturation, lightness, value
Transformscalex, scaley, shiftx, shifty, rotation
Duplicatoramount, rotation, scale, shiftx, shifty
Cameratranslatex, translatey, translatez, pan, tilt, roll
File/ILDAspeed
Modulator (osc/audio/env/seq)cycles, speed, level, phase, exponent, pulsewidth, spread, hit, duration, detail
Noisedetail, speed, level
Shapesize, scalex, scaley, cycles, waveshape, phase, speed, sides, points, depth, petals, loops, turns, exponent, cornerradius
Dottercount, phase, pathmix, repeat, cornerthreshold, offsetspeed
Textscalex, scaley, spacing, trim
Chasespeed, offset, width, fade
Phasoroffset, speed, spread
Layerselect, opacity, visible

Global Output

AddressTarget
/output/color/hueColor override hue
/output/color/saturationColor override saturation
/output/color/lightnessColor override lightness
/output/color/levelColor override level
/output/blackoutBlackout toggle
/output/speedSpeed multiplier

Output Groups

PatternTarget
/group/{index}/opacityGroup opacity (0-based)
/group/{index}/sendSend selected clip to group
/group/{index}/clearClear group
/group/{index}/selectSelect group
/group/{index}/select_clipSelect clip within group
/group/selected/{param}Same targets, but for the focused group

Output Group Effects

Effect chains are scoped to output groups. Slots are zero-based, and preset addresses target the first matching effect in the chain.

PatternTarget
/group/{index}/fx/{slot}/enabledEnable effect slot
/group/{index}/fx/{slot}/{key}Control effect slot parameter
/group/selected/fx/{slot}/{key}Control selected group effect slot
/group/{index}/fx/{preset_short}/{key}Control the first matching preset in a group
/group/selected/fx/{preset_short}/{key}Control the first matching preset in the selected group

Built-in preset short names are strobe, colorize, chase, scale_pulse, flash, and rotation. Control keys come from the effect's published controls.

See Effects for how to add effects and publish controls.

BPM

AddressTarget
/bpm/valueSet BPM. Accepts the actual BPM number (20–300), not a normalized value
/bpm/tapTap tempo
/bpm/resyncResync beat phase

Cue List

AddressTarget
/cue/playpausePlay / pause
/cue/stopStop
/cue/nextNext cue
/cue/previousPrevious cue
/cue/loopToggle loop
/cue/{index}/gotoJump to cue by index

Timecode

AddressTarget
/timecode/playpausePlay / pause
/timecode/stopStop
/timecode/seekSeek (0.0–1.0 of duration)
/timecode/skipbackSkip back 1 frame
/timecode/skipforwardSkip forward 1 frame
/timecode/skipback/{N}s|m|hSkip back N seconds, minutes, or hours (e.g. /timecode/skipback/10s)
/timecode/skipforward/{N}s|m|hSkip forward N seconds, minutes, or hours

State Refresh

AddressTarget
/refreshPush the full current state to the configured output
/syncAlias of /refresh

Send a zero-argument message (or any value) to /refresh when an OSC client connects after Modulaser already has OSC enabled. This re-sends every parameter value so widgets jump from their template defaults to Modulaser's actual state.

Address Aliases

Many addresses have short aliases that resolve to the same target:

Full nameAlias
saturationsat
lightnesslight
rotationrot
exponentexp
pulsewidthpw
translatex/y/ztx, ty, tz
enabledon
playpauseplay
previousprev
skipbackback
skipforwardforward
osc (modulator)lfo
env (modulator)envelope
seq (modulator)sequencer
speedspeedhz (oscillator, shape, chase, phasor, noise)
offsetspeed (dotter)speedhz
value (color level)val
file (prefix)ilda

Custom Mappings

Custom mappings let you override or extend the default address scheme. A mapping connects an OSC address to a control target with an optional input range.

When both a custom mapping and a default address match an incoming message, the custom mapping takes priority.

Wildcards

Custom addresses support two wildcard patterns:

  • * matches a single path segment. /clip/*/level matches /clip/x/level and /clip/y/level
  • ** matches zero or more segments. /group/**/opacity matches /group/0/opacity and /group/selected/opacity

When multiple mappings match, the most specific one wins (counted by literal segments).

Input Range

By default, Modulaser expects incoming values in the 0.0–1.0 range. If your controller sends values in a different range, like degrees (0–360) or MIDI-style (0–127), set a custom input range on the mapping. Modulaser normalizes the incoming value to its internal 0.0–1.0 range.

Inverting the range (e.g. 1.0 to 0.0) reverses the control direction.

Feedback

When OSC output is enabled, Modulaser sends parameter values back to your controller whenever they change, on default and custom addresses alike. Feedback is suppressed for 50ms after receiving a message on a given address to prevent loops.

The full current state is sent when OSC is first enabled. Clients that connect later can request the same push by sending to /refresh.

Wildcard Feedback

Custom mappings with wildcard addresses (e.g., /clip/*/cycles) track which concrete addresses have been received. Feedback is sent to those resolved addresses. Until a concrete address is seen, feedback falls back to the default address for the target.

Feedback Values

Most parameters send a value between 0.0 and 1.0. Clip selection and output group buttons use three states:

  • 1.0: selected / active
  • 0.5: occupied but not selected
  • 0.0: empty

Querying Parameters

Send a zero-argument message to any mapped address and Modulaser responds with the current value. This is useful for syncing a controller on connect or building custom status displays.

Queries always get a response, even if feedback suppression is active for that address. Action-only targets like /bpm/tap produce no query response.

Discovering Addresses

Send a zero-argument message to /info and Modulaser responds with a bundle listing every available address. Each entry contains five arguments: [address, kind, min, max, current_value]. Kind is one of continuous, toggle, or action. Action entries send NaN for the current value.

Responses are chunked into bundles of 12 messages to stay within UDP packet size limits.

You can scope the query to a specific category:

AddressReturns
/infoEverything
/info/clipClip parameters
/info/outputGlobal output
/info/groupOutput groups
/info/bpmBPM
/info/cueCue list
/info/timecodeTimecode