Moving with the music
Every lane in a clip, and every value in an effect, is a formula: a short expression that gives a number from 0 to 1 for each fixture, every frame. A formula can use where the fixture is, where the beat is and what the music is doing, so the lights move with all three.
A first formula
Add an Intensity lane to a clip and type:
sine(beat / 2)
beat counts beats, and sine is a wave that goes 0 → 1 → 0 once for each whole number. So every light swells once per two beats. Now make it travel:
sine(beat / 2 + x)
x is each fixture's position across its group, from 0 on one side to 1 on the other. Adding it shifts each fixture's wave a little, and the swell rolls across the group.
Make it react to the music:
sine(beat / 2 + x) * (0.3 + 0.7 * bass)
The wave still rolls, but its height follows the bass. Everything you can use is in the Formula reference.
What a formula can read
- Position:
xandyin the track's group,rigxandrigyacross the whole rig, andi,indexandcountfor a fixture's place in the group. See Layout and groups. - Time:
beat,bar, andclipbeat(beats since this clip launched). - Music:
bass,mid,high,levelandkick. See Tempo and audio.
Colors
The Color lane takes a whole color, not a number. Write #f80 or #ff8800, or build one with rgb(r, g, b) or hsv(h, s, v). Each hex color has a small color well; click it to pick another.
Colors add, subtract, multiply and divide, component by component, and a number applies to all three: #f80 * bass follows the music. mix blends two colors:
mix(#f80, #06f, sine(beat / 4 + x))
Longer formulas
Declare names first, end each declaration with a semicolon, and finish with the value to output:
let warm = #ff8800;
let cool = #0066ff;
let wave = sine(beat / 4 + x);
mix(warm, cool, wave) * bass
A declaration can use the ones before it. Names stay inside their formula, and can't be reassigned or replace a built-in.
Remembering
smooth(beats, value) softens a value: smooth(0.5, bass) follows the bass but doesn't flicker. delay(beats, value) repeats a value from some beats ago, up to 16, so delay(i * 0.5, kick) sends each kick down the group one fixture after another. History starts fresh when a clip is launched or the formula is edited. A stopped clip's values in the clip editor build their history from when you select it.
Writing formulas
- Autocomplete suggests variables and functions as you type, with their signatures. ↑ ↓ choose, Tab inserts, and Ctrl+Space opens the list. Tab and Shift+Tab move between a function's arguments, and the current argument is highlighted.
- Mistakes are underlined while you type, without changing the lights. Enter or clicking away commits the formula; Esc closes suggestions first, then cancels your draft.
- Drag numbers inside a formula: in
0.4 + 0.1 * sine(beat / 8), each of 0.4, 0.1 and 8 can be dragged on its own in steps of its last decimal place. The lights follow while you drag, and it's one undo step. - Formula reference… in the clip editor opens the full list of variables and functions.
The expanded editor
An open lane has a small square preview of its formula over the group's fixtures, running at the show's tempo and following what you type. The expand button beside any formula opens a larger editor with room for several lines and a square 2D preview of the formula over the group's fixtures: hover to read a value, and non-finite results show red. The preview has its own play/pause, restart and beat scrubber (looping after 64 beats), and its own audio: follow the engine, or choose Manual levels or an animated Test signal. None of this changes the lights until you press Apply (⌘Enter), which is one undo step. Cancel, × or Esc discard.
Shortcuts for the common cases
You don't have to write every formula. The helpers (LFO, Audio, Noise, Curve) write one for you; see Clips and lanes. Try them first, then open the formula to see how they work, and change it by hand from there. Presets are another way in.
Your own variables
A show can define variables of its own, such as energy, and move them live with faders. See Performance controls.
Functions of your own go in the Scripting panel.