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

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

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.