LFO Rack — Manual

Living automation for QLab — fader levels, multi-levels, play rate, and spatial object control.
"Precise by design. Unpredictable on demand."

Contents

LFO Rack sends OSC messages to QLab to automate fader levels, play rates, and spatial audio object parameters — living, waveform-driven movement instead of static settings.

Quickstart

Five steps to live automation. If you know QLab, you'll be running quickly.

1. Launch

Download and install LFO Rack to Applications (see Download on the website) and double-click LFO Rack.app. It runs as a free 14-day trial — see Licensing below.

2. Connect to QLab

Locate your QLab network passcode, or enable No Passcode.

The Workspace ID field fills in its numbers on a successful handshake — click it to refresh manually. The Workspace name field turns green and automatically shows the Qlab workspace name indicating the connection is successful.

3. Add a Target Unit and Detect Your Target

Under the LFO Module, click the + Fader button. A new Fader unit appears.

  1. In QLab, select the audio cue you want to automate.
  2. In the Fader unit, click Fader Detect.
  3. Wiggle a fader in QLab until one of the 80+ "link established" messages appear.

LFO Rack captures the OSC address automatically and the Detect button settles on a persistent LINKED label — it stays that way for as long as the lane is linked, not just for a moment after detecting. Click the FADER→ label (arrow) to jump directly to that cue in QLab.

Important — QLab cues must be named. An unnamed, unnumbered cue can't be addressed over OSC, so it can't be detected or linked.

4. Play

Click ▶ on the LFO module. The waveform animates and values stream to QLab in real time.

Three controls to start with:

5. Save As

Click Save As in the toolbar and navigate to your QLab folder. LFO Rack saves your configuration as a .lfo_rack file.


Licensing

Every install runs as a full-featured trial before you need a key — here's how the trial works, and how to buy and activate when you're ready.

Trial & Buying

LFO Rack runs as a full-featured 14-day trial from first launch — no key required to start. After the trial ends, the app drops to a Lite tier with one Fader unit remaining available; the rest unlock again once you activate a license. See Licensing Controls for the exact modal fields.

To buy a license: click the LFO Rack logo (or About LFO Rack in the app menu) to open Credits, then click Buy a License — or go straight to lforack.com/buy.

Activating a License

Open LFO Rack → Manage Your Licenses… from the app menu, paste your license key into the Activate with License Key field, and click Activate. License keys are tied to your machine's Hardware ID, shown in the same modal — see Licensing Controls for the full field-by-field breakdown.

Read the terms any time from LFO Rack → Read License Agreement… in the app, or the License Agreement on the website.


Guide

The Quickstart gets you running. This is the rest of the picture — what each control actually does, and why it behaves the way it does.

What LFO Rack Is

An LFO — low-frequency oscillator — draws the same wave over and over, slowly. That's different from a high-frequency oscillator, which vibrates so fast it produces audible sound on its own (your voice, whistle, anything you've ever heard). LFO Rack takes that slow wave, turns it into a steady stream of numbers, and sends those numbers to QLab as OSC messages. Those messages move faders, change play rates, or position audio objects in space. There's no patching and no scripting: you point a Target Unit at a QLab parameter, and press play.

Think of it as a very precise autopilot for your QLab faders. You set the route (the wave shape), the cruising speed (the rate), and how far the controls swing (the depth), then let it fly while you focus on the show. The difference between LFO Rack and riding a fader by hand is the difference between cruise control and holding your foot at a perfectly constant pressure for twenty minutes — the machine doesn't get tired, distracted, or inconsistent.

The LFO Module

The LFO module is the brain. Each one is a self-contained oscillator with its own shape, rate, and depth, and it can drive one or more Target Units — the things it actually controls, covered below. Here's every major control and, more importantly, why it behaves the way it does.

Wave Shapes

All seven shapes share the same rate, depth, and skew controls; what changes is the character of the motion.

ShapeCharacterBandwidth
SineSmooth, natural, organic — the classic LFO shape.Highest under load
TriangleLinear rise and fall with sharp peaks. Mechanical and precise; equal time going up and down.High
SquareInstant switching between two values — on/off, A/B. Sends almost nothing while the value is stable.Lowest
SawtoothRamps up, then snaps back down.High
Rev SawThe mirror image: ramps down, then snaps back up.High
Random SharpJumps to a new random value on every step. Generative and unpredictable.Low
Random SmoothGlides smoothly between random ± values instead of jumping.High

Triangle is the workhorse for movement where up and down should take equal time. Square is your A/B switch. Random Smooth is the cure for the "obviously automated fader" feeling — it adds life without a pattern anyone can lock onto.

Under the shape selector sits Skew+, a secondary slider reused across every shape whose meaning changes with it: on Sine it warps the curve without breaking its smoothness; on Triangle it bows the ramp faster or slower; on Square it's pulse width (how much of the cycle is spent "on"); on Sawtooth and Rev Saw it's ramp curve (straight or bowed); on Rnd Sharp and Rnd Smooth it's Span, the amplitude of each jump. A centered Skew+ gives you the textbook version of the shape; push it off-center to sculpt.

The Step Qualifier

The Step Qualifier is a small toggle that lives on the shape row itself and is available on the five "smooth" shapes: Sine, Triangle, Sawtooth, Rev Saw, and Rnd Smooth. Turn it on for whichever shape you're already using, and that shape starts sending a staircase instead of a continuous curve. Dial the resolution from 2 to 24 steps (default 16) with the arrows next to the stair-step icon.

The reasoning: a Triangle stepped at 24 levels is already smooth enough — it's unlikely anybody is going to hear the volume stepping in motion that fine — while it costs a fraction of the OSC bandwidth a full continuous curve does. Using the step qualifier offers significantly more processing efficiency without giving up the character of the desired movement. A stepped Sine is still recognizably a Sine, just a cheaper one. When a shape's qualifier is on, both the stair-step icon and the shape button itself turn teal, so you can see at a glance which shapes in a busy rack are running lean.

Spatial Unit vs Object Unit

They sound similar and both work with sound in space, but they're two entirely separate mechanisms.

Object is about position. Object moves the yellow dot in QLab's native Object Audio tab — it uses QLab's existing Object architecture to send X/Y coordinates straight to a QLab Audio Object. You aren't moving faders at all; you're telling QLab where the object is, and letting QLab's own spatial renderer figure out the loudspeaker levels.

Spatial, on the other hand, is about proximity. Spatial moves faders directly. It operates on a custom canvas where you place output-channel dots representing speaker positions or QLab channels. A yellow "proximity dot" travels a path you configure; as it moves close to an output dot, that channel's fader rises, and as it moves away, the fader falls. The Spatial Unit automates QLab faders, not QLab's native Object audio engine.

Randomize Row — Wobble + Bounce

Every LFO module has a Randomize row just above the Target Unit launch buttons. This adds two random modulation layers that make LFOs feel organic and unpredictable without any manual tweaking. The Randomize button sets both controls to a random value.

Wobble randomly changes the rate of the LFO from subtle to wild. At low values the LFO rate changes slightly — the period stretches and compresses in an irregular, human-feeling way. At high values the rate wanders aggressively. Wobble never reverses phase; it only speeds up or slows down.

Bounce randomly changes the direction of the LFO. Low values will change direction infrequently, while high values may change direction every cycle or even half cycle.

1-Shot Mode

Enable 1-Shot and the LFO stops being a perpetual-motion machine: it plays for a defined amount, then stops itself. No babysitting, no follow-up cue to kill it.

Flip between the two modes with the orange/teal pill toggle. Each mode remembers its own value independently, so bouncing back and forth between Cycles and Secs never wipes what you had set.


Target Unit Types
A Target Unit is the interface an LFO module actually drives. LFO Module > Target Unit > Qlab. One LFO module can drive several target units at once, and each target unit carries its own color so you can read a busy rack at a glance.

Fader Unit

Color: orange. Automates a single QLab audio fader or crosspoint.

Rate Unit

Color: teal. Controls the playback speed (and also pitch) of a QLab cue. You will notice the length of the audio cue in Qlab constantly changing as the rate wobbles over the range of the slider.

Multi Unit

Color: green. Controls multiple fader levels or crosspoints on a single track with various shapes and randomizations.

Because multiple parameters are being addressed simultaneously, there's a lot more going on under the hood of the Multi Unit. A single OSC address is unable to adequately show what's going on, so the OSC address is omitted on this unit. 

Object Unit 
Color: Coral. Sends X/Y position straight to QLab's native spatial audio object engine, "The Yellow Dot" — see Spatial Unit vs Object Unit above for the big picture.

Spatial Unit

Color: Lavender. The proximity-based spatial engine — see Spatial Unit vs Object Unit above for the big picture. The Spatial Unit gives you up to 32 "output dots" which the "proximity dot" travels through in circular or linear shapes. The proximity of the dots determines the volume of the output.


OSC /live

QLab supports a /live suffix on many OSC addresses. Appending it "/live" tells QLab to apply the incoming value without redrawing its own UI to show the change, and also without creating an undo point in the undo buffer. The fader stops visibly moving in QLab's UI, but the underlying automation keeps running in the background. For a QLab workspace under heavy automation pressure (a rack full of fast-moving lanes), skipping the redraw and undo offers real efficiency and processing headroom to QLab, since it no longer has to animate a fader cap or slider on screen for every message it receives — it just applies the control values and moves on.

The toggle has two levels that combine with a simple OR: a per-lane toggle, and a rack-wide global toggle in the Options menu (OSC /live (All)). Turning the global toggle on doesn't touch any lane's own stored setting — it just adds its own OR on top of whatever each lane already has. Turn the global toggle back off and every lane reverts to exactly what it had set individually.


Bi-Directional Qlab - LFO Rack Integration

Creating QLab Network Cues from LFO Rack

Every lane header has an [↗ QLab Cues] button. Click it to open the modal, which shows the OSC addresses for that lane and lets you create Network cues directly in QLab — for Enable, Disable, and Toggle (or Start/Stop for LFO-level cues).

Check the boxes for the cues you want to create in Qlab, then click Create in QLab. LFO Rack sends them to the currently connected workspace under your currently selected cue. Each created Network cue is pre-filled with the correct OSC address and named {lfo_id} / {target} — {command} so it's identifiable in your cue stack.

The LFO Cues toolbar button opens the same panel at the LFO-module level, for Start, Stop, Sync, and 1-Shot commands.

Mark LFO Cues

Gives you two ways of visually identifying cues being controlled by LFO Rack: text and color. Marking LFO Cues with text gives you a way of using Qlab's search function to quickly find targeted cues in complicated workspaces. Coloring targeted cues give you a visual indicator of what cues are being controlled by LFO rack. 

QLab menu → Mark LFO Cues… renames and/or color-tags QLab cues based on which cues are currently linked to LFO lanes.

Controlling LFO Rack from QLab Network Cues

You may also create your own network cues inside Qlab to control LFO Rack (it's easier to create network cues from inside LFO Rack, btw.) Every LFO module publishes a set of OSC addresses you can use to control LFO Rack from QLab Network cues — turning LFOs and target units on and off from inside Qlab. Find the addresses in the LFO Cues modal (toolbar button) in every unit; every address has a copy button next to it. Place Network cues inside QLab groups so LFO parameters are controlled from within your cue stack.

CueAddressArgEffect
1/lfo/lfo1/oneshot/cycles4Set 4-cycle limit, enable 1-Shot
2/lfo/lfo1/target/Scene1-Fader/enable—Enable the Scene 1 fader lane
3/lfo/lfo1/start—Start; LFO runs 4 cycles and stops automatically

Drop these commands into a group cue and the LFO's timing is parameterized entirely from QLab, without ever touching LFO Rack during the show.

The commands you'll reach for most:

AddressArgEffect
/lfo/<id>/start—Start the LFO
/lfo/<id>/stop—Stop the LFO
/lfo/<id>/sync—Reset phase to zero crossing
/lfo/<id>/target/<name>/enable—Enable a named lane
/lfo/<id>/target/<name>/disable—Disable a named lane
/lfo/<id>/oneshot/cyclesfloatSet cycle count + enable 1-Shot
/lfo/<id>/oneshot/secsfloatSet duration + enable 1-Shot

Find <id> and lane <name> values in the LFO Cues modal. Rate, depth, shape, and target address are set in the LFO Rack UI — they can't be changed via OSC at runtime.

QLab Hotkey Integration

LFO Rack's window can forward a handful of transport keystrokes straight to QLab, so even if LFO Rack has focus, you can still use Qlab hotkeys: Go, Pause, or Panic without clicking back and forth mid-tech. Toggle this integration in the Options menu (QLab Hotkey Integration) — on by default.

It's automatically disabled while you're typing in any input or text field, and while any modal dialog is open, so it never steals a keystroke you meant for LFO Rack's own controls.

KeyActionQLab OSC address
SpaceGo — play the next cue/go
vPreview the selected cue/cue/selected/preview
sStop the selected cue/cue/selected/panic
pPause the selected cue/cue/selected/pause
[Pause all/pause
]Resume all/resume
EscPanic — stop everything in QLab (also stops all running LFOs)/panic
Esc, Esc (within 400ms)Hard Stop/hardStop
Shift + <Collapse all LFO modules in the rack (not a QLab command — always active, even with hotkeys off)—
Shift + >Expand all LFO modules in the rack (not a QLab command — always active, even with hotkeys off)—


Performance and Bandwidth

Caution: LFO Rack can unintentionally send enough OSC messages to overwhelm QLab's ability to respond to them. Excessive OSC pressure on QLab can cause errors, slowdowns, spinning beachballs, and crashes — use at your own risk. Within reasonable limits LFO Rack works flawlessly.

Safeguards

Built into LFO Rack are several safeguards designed to protect QLab from being flooded with OSC messages. Think of them like a compressor/limiter followed by a bit-reduction stage. The BW indicator in the toolbar is your gauge of OSC output pressure.

BW% (bandwidth) shows the OSC bandwidth budget filling up. When you see red lights, there is some data thinning going on behind the scenes to keep QLab from drowning. 

LEDBW%What's happening
Green100%No thinning — full rate
Yellow50–99%Mild thinning — barely noticeable
Orange17–49%Moderate — smooth shapes start to staircase
Red≤14%Heavy — expect stepped output on all smooth shapes

Automatic resolution thinning. At extreme OSC message volume, the last resort is that the smooth shapes — Sine, Triangle, Sawtooth, Rev Saw, Random Smooth — automatically lose resolution and quantize into discrete steps. The harder you push, the coarser the steps. The canvas preview shows exactly what QLab is receiving, so you can watch a smooth curve turn into a staircase in real time — this is your signal that you're in the danger zone. Square and Random Sharp are mostly unaffected, since they're already stepping shapes and don't consume much bandwidth to begin with. 

Practical limit. In testing, 144 simultaneous targets (4 Multi units × 3 control rows × 12 faders) is QLab's practical ceiling. Past that, QLab's own OSC buffer is the bottleneck no matter how efficiently LFO Rack sends. Test your own rig, but be prepared for spinning wheels and crashes at the extreme end.

Use Network cues to turn LFO's and Target units on and off when not needed. Use 1-shot to automatically turn off LFO's after the movement is no longer needed.

Shape choice for bandwidth-constrained shows. If a show is tight on headroom but you still need controlled movement, reach for the step qualifier on whichever shape you're already using and dial its resolution down to what you actually need. It costs a fraction of the full curve's bandwidth and hands you direct control over how many messages per second you generate — you decide the trade between smoothness and load, instead of leaving it entirely to the automatic thinner.


Reference

Every parameter, every control, every edge case. For the "why," see the Guide.

Detection Workflow

Important — QLab cues must be named. An unnamed, unnumbered cue can't be addressed over OSC, so it can't be detected or linked.

Workflow: select the target cue in QLab → click the lane's Detect button → move the corresponding control in QLab → watch the button settle on LINKED. Once linked, a Detect button reads LINKED permanently — not a temporary reward message — until you unmap the address. All four detect-capable lane types (Fader, Rate, Multi, Spatial) behave identically.


Toolbar

Runs across the top of the window: connection fields, save/module controls, and live bandwidth/OSC/Live indicators.

ControlDescription
WorkspaceQLab workspace name, case-sensitive. Turns green when connected.
HostIP address of the QLab machine. 127.0.0.1 for same Mac.
PortOSC receive port. QLab default is 53000.
PasscodeOptional. From QLab Settings → Network. Leave blank if using OSC Access without a passcode.
PLAY ALL / STOP ALLTwo separate buttons. PLAY ALL/STOP ALL toggles every LFO module's transport at once (label flips depending on state). STOP ALL is a distinct single-line button (transparent background, muted red border, filled-square icon) that always stops every LFO regardless of the toggle state.
BW X% chipAvailable OSC bandwidth as a percentage of budget. Green 100% (no thinning) · Yellow ~50–99% (mild) · Orange ~17–49% (moderate, smooth shapes degrade) · Red ≤14% (heavy, stepped output on all smooth shapes).
out / in indicatorsFlash on each OSC message sent to / received from QLab.
Max OSCMessage-per-second budget BW% is measured against. Fixed 600 msg/s (not adjustable).
LIVE indicatorSmall red text tag in the OSC-meter toolbar cell. Hidden unless the global /live toggle (Options menu) is on.

The Workspace name must match QLab's workspace title bar exactly, including capitalization. Host is the IP of the Mac running QLab — 127.0.0.1 when both apps run on the same machine. Port is set in QLab under Settings → Network (factory default 53000). Passcode is only required if QLab's Network settings have one configured.

The thinning pipeline (triggered as BW% drops) runs four serial layers on every engine tick: a tick gate that skips whole ticks when the rate exceeds budget; shape quantization that snaps Sine, Triangle, Sawtooth, Rev Saw, and Rnd Smooth output to a coarser level set (with hysteresis against boundary jitter); delta suppression that skips resending an unchanged value; and bundle packing that combines a lane's messages into one UDP packet where possible.

Global Live toggle (Options menu → OSC /live (All)): clicking it shows a confirmation popup with a "Don't show again" checkbox (app-prefs only, never saved in the show file). Popup text, verbatim: "Global Live Mode: Changes all LFO units to live mode. Halts all visual movement in QLab: fader levels, rate, object. LFO movement persists in the background. This toggles live mode all-on or all-off." See OSC /live Controls below for full behavior.

LFO Module Controls

ControlDescription
⠿⠿ handleDrag to reorder LFO modules.
Module nameClick to rename.
OSC IDShort identifier used in incoming OSC addresses (e.g. lfo1). Shown in the LFO Cues modal.
▶ / ■Play / Stop the LFO engine.
RateLog-scale slider, 0.001–8 Hz. Switchable to BPM. Snaps to standard values (0.01, 0.05, 0.1, 0.25, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 7 Hz) within a 4% tolerance. Default 0.25 Hz.
OffsetShifts the waveform positive or negative relative to the center line.
Shape selectorSeven shapes: Sine, Triangle, Square, Sawtooth, Rev Saw, Rnd Sharp, Rnd Smooth. No dedicated Step shape — see Step Qualifier Controls.
Skew+Secondary slider whose label and behavior change per shape — see Shape Parameter.
1-Shot buttonEnable auto-stop mode — see 1-Shot Mode.
CanvasLive waveform preview. Visibly steps when bandwidth thinning quantizes the output.

The engine ticks internally at 60 Hz — the upper bound for Fader and Play Rate output. Multi and Spatial lanes are capped at 30 Hz to protect QLab; Object lanes are capped lower still, at a constant 15 Hz.

Wave Shapes

ShapeDescriptionShape ParameterBandwidth
SineSmooth sinusoidal.Skew (phase-warp asymmetry).High
TriangleLinear rise and fall, sharp peaks.Angle (peak position / ramp curve).High
SquareInstant min/max switch.Pulse Width.Low
SawtoothRamps up, snaps back down.Ramp Curve.High
Rev SawRamps down, snaps back up.Ramp Curve.High
Rnd SharpJumps to a new random value each step.Span (amplitude of each jump).Low
Rnd SmoothGlides smoothly between random values instead of jumping.Span.High

Smooth shapes (Sine, Triangle, Sawtooth, Rev Saw, Rnd Smooth) auto-quantize under bandwidth pressure. Square and Rnd Sharp are unaffected — they already produce long constant-value runs that delta-suppression collapses, so they cost far less OSC throughput.

Shape Parameter (Skew+)

A single secondary slider, repurposed per shape:

ShapeSkew+ labelEffect
SineSkewPhase-addition warp that shifts the peak earlier or later without breaking the smooth curve.
TriangleAngleBows the otherwise-linear ramp and moves the apex.
SquarePulse WidthSets the duty cycle — how much of each cycle sits at max vs. min.
Sawtooth / Rev SawRamp CurveBows the ramp concave or convex.
Rnd Sharp / Rnd SmoothSpanMaps 0→1 slider travel to 5%–100% of full amplitude for each random jump.

Centre position is always neutral (symmetric sine, 50% pulse width, straight ramp, mid-span randomness). The value is stored per-shape, so switching shapes and back restores the shaping dialled in for that shape.

Step Qualifier Controls

There is no dedicated "Step" shape in the current build. In its place: a per-shape on/off toggle plus a resolution stepper, occupying the 8th slot in the shape row.

ControlDescription
Qualifier togglePer-shape on/off. Available on Sine, Triangle, Sawtooth, Rev Saw, and Rnd Smooth only — not available on Square or Rnd Sharp, which are already discrete/stepped.
Resolution stepper◂ N ▸ control, expands in place when the qualifier is toggled on. Range 2–24, default 16.
Teal indicatorWhen a shape's qualifier is engaged, that shape's button icon stroke turns teal (#5ab4c8 — the same hex as the Rate/Play Rate lane accent) instead of gaining a second border.

Manual step resolution combines with automatic OSC bandwidth-thinning via min() — whichever is more restrictive wins for that tick. Auto-thin is always a safety net layered on top; it never loosens a manual choice to something coarser than what the user dialled in.

Fader Unit

Orange accent (#e8900a). Drives a single QLab fader (output crosspoint level).

ControlDescription
⠿⠿ handleDrag to reorder lanes within the module.
FADER→Go to the linked cue in QLab. Dims when no address is set.
Address fieldOSC address, e.g. /cue/Scene_1/level/0/1.
/L badgeInline clickable badge next to the address field's × clear button. Appends /live to this lane's address. See OSC /live Controls.
Fader DetectSelect cue in QLab → click → wiggle fader. Reads LINKED on success, persistently.
Phase offset0–360°. Shifts waveform timing. Sticky detents at 0° and 180°; double-click to toggle between them.
Curve modeCrossfade (default) / Equal Power / Linear dB.
×Remove this lane.

Curve modes — Equal Power: sin taper in dB, midpoint ≈ −6 dB, matches console fader behavior. Linear dB: straight dB ramp, midpoint halfway between min/max dB. Crossfade: sin taper in amplitude (not dB), midpoint −3 dB, designed for two fader lanes 180° out of phase on the same module.

Maximum simultaneous targets: 144 across all fader lanes in the rack — QLab's OSC pipeline ceiling, not an LFO Rack limit. Address pattern: /cue/<cue>/level/<row>/<col>.

Rate Unit

Teal accent (#5ab4c8). Drives a cue's playback rate.

ControlDescription
RATE→Go to the linked cue in QLab.
Address fieldOSC address, e.g. /cue/N/rate.
/L badgeSame inline badge and behavior as Fader — appends /live.
Rate DetectSelect cue → click → wiggle the Rate slider in QLab's Time & Loops panel. Threshold 0.05×. LINKED persists once detected.
1× buttonImmediately sends rate = 1.0, bypassing the LFO.
Range sliderMin/max playback rate. Log-scale, midpoint = √(min × max). Default 0.5×–2.0×.

Auto-reset: Play rate lanes reset to 1.0× whenever the LFO stops, the lane is disabled, or the lane has no address.

VariantQLab UI updateUndo queueWorks on stopped cues
/cue/N/rateYes~120 entries/minYes
/cue/N/rate/liveNoNoneOnly while cue is playing

Plain /rate dual-sends: full 60 Hz to /rate/live for smooth control, ~2 Hz to /rate for visual feedback, keeping the field moving without flooding the undo queue.

Multi Unit

Sage accent (#7aaa6a). Drives a row of QLab faders/crosspoints from one waveform.

ControlDescription
Cue fieldQLab cue name or number. Supports wildcards (*, [N-M]).
Detect CuePersistent button on row 0 (openDetectModal) — same detect mechanism as Fader/Rate/Spatial. Select cue → click → wiggle a fader. Reads LINKED persistently once linked.
Col startStarting column (crosspoint) index.
Col countNumber of columns to drive. Default 12.
SkipComma-separated column indices to exclude.
Direction toggleCW / CCW sweep direction.
Mode selectorSix modes — see below.
Cycles / Fulcrum / PulseRelabels to FULCRUM in Seesaw, PULSE in Soundcheck.
Row countNumber of output rows, 1–9.
Per-row enable, PHASE, DEPTH, OFFSET, INVERTSame per-row controls as before — enable toggle, wave offset (0–359°, double-click resets), amplitude scale (0–200%), center offset (−100% to +100%), high/low flip.
/Live buttonNo address field on Multi, so the toggle is a labeled button rather than a badge. Appends /live to every address the lane sends. Each per-row "row card" gets a red border (#BD1613) when this lane's /live is active (global or local).
Curve modeNew Multi lanes default to Equal Power (was Crossfade).

Modes: Rotate (sequential sweep, stadium wave) · Pong (Rotate that reverses at the last column) · Stripes (unison at Cycles=1, alternating bands at higher Cycles) · Seesaw (fulcrum splits columns, one side rises as the other falls; Fulcrum range 1–8, default 4) · Soundcheck (pushes one fader at a time) · Random (independent random phase per column).

Max update rate: 30 Hz. Practical ceiling: 6 Multi lanes recommended for reliable live use; 8–9 lanes at full column count can overwhelm QLab. Address format: /cue/<cue>/level/<row>/<col_start+i>, sent per column per enabled row.

Spatial Unit

Purple accent (#BEABE5). Moves a yellow cursor along a canvas path; proximity to placed output dots drives fader level. Controls QLab faders, not audio objects.

ControlDescription
Shape buttonsCircle, Oval, H-Line, V-Line.
→ cue-jump labelReplaces the old SPAT→ label and full address input, which are removed. Jumps QLab to the linked cue. There is no editable address field or unmap button — the lane computes its own per-channel addresses from the linked cue.
Fader DetectRenamed from plain "Detect" to match Fader lane naming. Select cue → click → wiggle a fader. Reads LINKED persistently once linked.
Curve modeXfade / Eq.Pow / Linear — same taper behavior as Fader lane curve modes.
Loop/Bounce toggleSingle button (was two mutually-exclusive buttons). Loop: continuous orbit driven by raw LFO phase. Bounce: dot sweeps to the opposite point and back, shaped by the active wave.
CW/CCW toggleSingle button (was two mutually-exclusive buttons). Sets sweep direction.
/Live buttonNo address field on Spatial, so the toggle is a labeled button. The canvas wrapper gets a red outline (not a border — no layout shift), 2px solid #BD1613, 2px offset, when this lane's /live is active.
Arc handle (H-Line/V-Line)Purple ⍻ handle at the line's midpoint. Drag perpendicular to bow the path into a quadratic arc (arc_bend, −1 to 1). Double-click resets to straight.
Scale View sliderZooms the canvas. Range 12.5%–100%, default 60% (was 80%).
Radius sliderScales the radius of all visible output dots.
Output dot positionsDrag dots on the canvas to place each channel.
Active channel checkboxesEnable/disable individual output channels.
FLOAT buttonRenamed from LIVE, then FREE, now FLOAT — specifically to avoid colliding with the unrelated OSC /live feature above. When enabled with the LFO stopped, makes the yellow dot draggable by mouse and fires OSC on mouse-move for manual placement.

Canvas: resized 400×400 → 400×250. The yellow cursor follows the path at 30 Hz. Proximity drives /cue/<cue>/level/0/<col> per active dot: 0 dB at zero distance, −100 dB at or beyond the dot's effective radius (its own radius × the Scale View factor).

Object Unit

Coral accent (#ff6361). Sends 2D position coordinates to a QLab audio object — QLab's own "yellow dot" in the Object tab. Use for spatial-audio objects (Atmos, spatial plugins). This lane controls X/Y position only — there is no Z axis.

Two canvases, A and B (198×198 each), one per row/object, each previewing that row's path.

Per-row controlDescription
Enable toggleIndependent per row (A/B).
OBJ→Go to the linked cue in QLab.
Address field/cue/<N>/object/<name>/position, where name is A or B as shown in QLab's Object tab. Wildcards accepted (e.g. /cue/1/object/*/position) to address every object at once.
/L badgePer-row, independent (no lane-level toggle). Collapsed-row view shows one combined badge that flips both rows together and reads active if either row is live. Caveat: the app's own Object help modal warns not to use this — QLab does not support a /live path on object-position addresses.
×Clear this row's address.
Shape buttonsCircle or Line only.
DIR (Circle only)CW / CCW.
ROTATE (Circle only)0–359°, drag to set, double-click resets.
SIZE (Circle only)Radius, 2–200.
STARTPhase offset, 0–359° — sets where the sweep begins.
Loop / Bounce (Line only)Loop: continuous sweep. Bounce: sweeps back and forth.
INITReset this row to its initial state.

There is no Detect for Object lanes — QLab does not push object-position changes back via OSC. Addresses must be typed manually. Coordinates run −500.0 to +500.0 on both axes, (0,0) at centre. Object lanes send at a constant 15 Hz cap (obj_divisor = 4, 60 / 4) — slower than Multi and Spatial's 30 Hz.

OSC /live Controls

Two levels combine with a simple OR: a per-lane toggle and a rack-wide global toggle (Options menu → OSC /live (All)). Either one being on makes that lane's sends live; per-lane buttons are never force-checked or disabled by the global toggle.

Lane typeControl shown
Fader, RateInline /L badge next to the address field, beside the × clear button.
Object/L badge per row (A/B), independent. Collapsed view shows one combined badge, active if either row is live. Unlike Fader/Rate, this is not officially supported — QLab does not accept /live on object-position addresses (per the app's own Object help text).
MultiLabeled /Live button (no address field to badge). Also colors each per-row "row card" border red when active.
SpatialLabeled /Live button. Also outlines (not borders — no layout shift) the canvas wrapper red when active.

Colors (one unified scheme across every /live surface — badges, buttons, address-field borders, Multi row-card borders): inactive #A28863 text / #B01511 border; active #BD1613 for both text and border.

Every lane type also shows a right-aligned /live badge on its collapsed row, editable without expanding the card.

The global toggle's confirmation popup text, verbatim: "Global Live Mode: Changes all LFO units to live mode. Halts all visual movement in QLab: fader levels, rate, object. LFO movement persists in the background. This toggles live mode all-on or all-off." It has a "Don't show again" checkbox saved to app prefs, not the show file. When the global toggle is on, a small red LIVE tag appears in the toolbar's OSC-meter cell.

Randomize Row

ControlDescription
⚄ RandomizeSets Wobble and Bounce to random values between 10–80%.
Wobble slider0–100%. Random walk on the per-tick rate multiplier. Double-click resets to 0.
Bounce slider0–100%. Periodic direction flip; higher = more frequent reversals. Double-click resets to 0.

Wobble is a bounded random walk on phase increment, clamped so the LFO never reverses or stalls, only speeds up or slows down. Bounce fires a periodic direction reversal via a countdown timer (4–8 cycles between flips at low Bounce, 0.25–1.5 cycles at high Bounce), redrawn each time it fires. Both reset on LFO restart. Independent and additive with each other.

1-Shot Mode

ControlDescription
1-Shot buttonToggle enable/disable.
Cycles ⇄ SecsOrange tint = Cycles mode. Teal tint = Secs mode.
Value inputCycle count or seconds, depending on active mode.
Countdown displaySecs mode only: shows "X.Xs left" while running.

Cycles mode: stops after exactly N complete cycles. Valid values: 0.5, and integers 1–999. 0.5 plays exactly a half-cycle (rise to peak, stop) for a clean one-way transition.

Secs mode: stops after exactly N seconds of runtime, accurate to within one 60 Hz tick (≈17 ms), counted from the moment ▶ is pressed. Both modes remember their values independently.

Reordering

Drag the ⠿⠿ handle in any lane header to reorder lanes within a module. Drag the ⠿⠿ handle in any module header to reorder modules in the rack. Changes persist immediately to session state and are included in Save As.

Creating QLab Network Cues from LFO Rack

ControlDescription
↗ QLab CuesPer-lane button. Opens the target modal for that lane — OSC addresses and Create in QLab.
↗ LFO Cues toolbarOpens the module-level panel — Start, Stop, Sync, 1-Shot, and lane Enable/Disable addresses.
Enable / Toggle checkboxesSelect which cues to create. Enable turns the lane on; Toggle flips its state.
Create in QLabSends selected Network cues to the connected QLab workspace.

The modal is a two-tab layout: Controls (active by default on open) and Instructions. The Controls tab lists this LFO's Start/Stop/Sync rows, then an "All LFOs" section with workspace-wide Start All / Stop All rows (each still has its own per-row inclusion checkbox, same as every other row — the difference is scope: they target every LFO module, not just this one), then 1-Shot control rows. The Create in QLab button lives at the bottom of the Controls tab.

Each created cue arrives pre-filled: OSC address in the message body, cue name {lfo_id} / {target} — {command}. Requires an active QLab connection. With no workspace connected, a toast shows "Failed — is QLab connected?". With no boxes checked, the button does nothing.

Mark LFO Cues

QLab menu → Mark LFO Cues… — scans all linked lanes for cue numbers and sends rename and/or color commands to those cues in QLab.

ControlDescription
Tag checkboxAppends [LFO] to each matched cue's name. Already-tagged cues are skipped.
Set cue colorSends a colorName OSC message. 9 solid colors plus a hollow circle (None = clear color).
Color checkboxEnables/disables the color step independently of tagging.

Lanes scanned: Fader (from OSC address), Rate (from OSC address), Multi (Cue field), Spatial (Cue field), Object (all row addresses). Duplicate cue references are de-duplicated and processed once.

Save, Save As, and Autosave

ControlDescription
Save AsOpens a Save panel, writes to a new .lfo_rack file. After saving, the QLab Startup button generates an AppleScript pointing at the new path.
Save (Cmd+S)Overwrites the current .lfo_rack file. Prompts for a path (Save As) if none set yet.
Autosave2 seconds after any change, silently overwrites the current file. Only runs once a file has been saved.
BackupsWithin 5 minutes of a change, writes a timestamped copy into a ShowName backups/ folder alongside the main file. 20 most recent kept, older pruned automatically.
QLab StartupGenerates an AppleScript for a QLab Script Cue that auto-launches LFO Rack with the saved show. Updates automatically to point at the most recently saved path.

Spatial Lane vs Object Lane

SpatialObject
What it controlsQLab faders (via proximity math)QLab audio object position (X/Y)
MechanismYellow dot moves on a canvas; proximity to output dots drives fader levelsSends position coordinates to QLab's spatial engine
Best forSurround panning via a QLab fader matrixAtmos / spatial plugin objects
Detect availableYes (Fader Detect)No — QLab doesn't push object position via OSC
QLab access levelControlEdit

Effects Parameters

QLab does not expose audio Unit effect parameters via OSC feedback. Rate Detect cannot detect AU changes — QLab doesn't push them back, so there is nothing for Detect to read. Direct OSC sends to AU parameters may work for some parameters if you know the address (enter it manually in a Fader lane); not officially supported. This is a QLab limitation, not an LFO Rack one.

Licensing Controls

Concept and workflow: see Trial & Buying and Activating a License in the Licensing section above.

ControlDescription
Logo / About LFO RackOpens the Credits modal — app info, version, and a Buy a License card above the User Manual button.
Buy a License cardOpens lforack.com/buy in your browser.
LFO Rack → Manage Your Licenses…Opens the License modal: a status badge (e.g. LITE), a Buy a License card, your machine's Hardware ID with a copy button, and an Activate with License Key field.
License key fieldPaste the key you received after purchase, then click Activate. Keys are tied to your machine's Hardware ID.
LFO Rack → Read License Agreement…Opens the End User License Agreement — same text as the website's License Agreement.

Troubleshooting

1. LFO is playing but QLab fader isn't moving

  1. Confirm the workspace name matches exactly (case-sensitive).
  2. Check the out indicator flashes when the LFO is playing.
  3. Verify the OSC address by sending it manually from a QLab Network Cue.
  4. In QLab, confirm OSC receive is enabled on port 53000 (Settings → Network).
  5. Confirm the QLab access level.

2. Workspace name won't turn green

  1. Double-check the workspace name against QLab's title bar — case-sensitive.
  2. Confirm the access level in QLab Settings → Network: enter the Passcode, or enable View/Control/Edit in OSC Access.
  3. If QLab is on a different machine, confirm the Host IP and that both machines share a network.

3. Fader Detect captures the wrong cue

  1. Make sure the target cue is selected (highlighted blue) in QLab before clicking Fader Detect.
  2. Moving the fader of an unselected cue won't trigger detection.
  3. After selecting, click Fader Detect again before moving the fader.

4. Rate lane is not affecting playback speed

  1. Check the cue is currently playing — /rate/live only controls active cues.
  2. If stopped, the stored rate (plain /rate) updates, but live speed control takes effect only once the cue starts.
  3. Confirm the lane's address is correct via the RATE→ button.

5. BW% drops quickly with few LFOs active

  1. Check active Multi lane count — each can send up to 12 addresses × 30 Hz.
  2. Reduce Multi lane count or col count.
  3. Turn on the step qualifier on smooth shapes to cut message volume.
  4. Raise the Max OSC budget in the toolbar if your system can handle more throughput.

6. 1-Shot stops too soon (Secs mode)

  1. Confirm the mode pill is teal (Secs), not orange (Cycles).
  2. Check the value in the input field.
  3. Secs mode counts from the moment ▶ is pressed, not from when the LFO was last configured.

7. macOS blocks LFO Rack from opening

  1. LFO Rack is signed and notarized, so a plain double-click should work. If macOS still blocks it (e.g. a damaged download), right-click the app icon in Finder and choose Open.
  2. Click Open in the confirmation dialog.
  3. If that still fails, re-download LFO Rack — the download may be incomplete or corrupted.

8. Object position not responding to OSC

  1. Confirm the QLab access level is Edit (object position requires Edit, not just Control).
  2. Verify the object name matches exactly (case-sensitive) in QLab's Object tab.
  3. Confirm you are using the /live variant of the address for real-time control.

OSC Reference

You don't need to know OSC to use LFO Rack — Detect buttons and copy-paste workflows configure it for you. But the moment you want to drive LFO Rack from a QLab Network Cue, target a spatial object by hand, or figure out why a message isn't landing, a little protocol knowledge goes a long way. This section assumes you know QLab cold and have simply never typed an OSC message yourself.

What Is OSC?

OSC — Open Sound Control — is a networking protocol for audio and media gear. Think of it as MIDI's more flexible, network-native cousin. Where MIDI speaks in fixed channel numbers and note values, OSC speaks in addresses that read like file paths, e.g. /cue/Scene_1/level/0/1. The value you're sending travels alongside the address in the same message.

OSC rides over your local network as UDP — fast, essentially instantaneous, and fire-and-forget: there's no delivery receipt. (That "no receipt" part matters — it's why the /live suffix below has trade-offs to weigh.)

The practical payoff: one app on your network can automate many parameters on a QLab machine, addressing each by name — no MIDI cables, no channel-count ceiling, no patch bay. Just names and numbers over the wire.

Address Anatomy

Every OSC message starts with an address. Reading one is exactly like reading a folder path — broad on the left, specific on the right.

/cue/Scene_1/level/0/1 — read as: the crosspoint level (fader) connecting output 0 to input 1, inside the cue named "Scene_1."

SegmentMeaning
cuethe kind of QLab object
Scene_1the specific target, by name
levelthe parameter type (a fader crosspoint)
0/1the output / input indices

/lfo/lfo1/start — read as: the start command for LFO module "lfo1" inside LFO Rack.

SegmentMeaning
lfoLFO Rack's namespace
lfo1the module's OSC ID
startthe command — no value needed, the address itself is the instruction

The pattern, every time: starts with /, segments separated by /, reads left-to-right from broad to specific, last segment is usually the parameter or command name. Learn to scan an address this way and most of OSC stops being mysterious.

Values and Types

OSC messages carry a typed value alongside the address, so the receiver knows how to interpret it. LFO Rack sends two kinds:

You never have to declare a type by hand; LFO Rack tags every outgoing message correctly. When you write a Network Cue to drive LFO Rack, QLab handles the typing for you too — you just type the number.

The /live Suffix

QLab supports a /live suffix on many of its own OSC addresses. Appending it tells QLab to apply the incoming value headless — update the parameter without redrawing its own UI to show the change. That matters because QLab's redraw isn't free: animating a fader cap or a slider on screen for every single incoming message costs QLab real processing time. Skip the redraw and QLab just applies the number and moves on.

Reach for it when the automation load is heavy — many lanes running simultaneously, all streaming updates at once. A handful of fader lanes rarely needs it; a rack full of fast Multi and Spatial lanes usually does. If QLab's UI feels laggy or a busy show is pushing your BW% chip into yellow or orange, /live is the first thing to try before you start cutting lanes.

LFO Rack exposes it as two toggles that combine with a simple OR: a per-lane toggle (the /L badge or /Live button on each lane), and a global toggle in the Options menu (OSC /live (All)) that ORs on top of every lane's own setting. Flip the global toggle off again and each lane reverts to exactly what it had set individually — nothing is lost. Full control-by-control detail on which addresses accept /live lives in the Reference section.

LFO Rack Incoming OSC

LFO Rack listens on UDP port 9000. Every incoming address follows the shape /lfo/<id>/..., where <id> is the OSC ID of the LFO module you want to control.

To find a module's ID and every exact address it responds to: click ↗ LFO Cues in the toolbar. The modal lists each one with a copy button right next to it — paste straight into a QLab Network Cue, no typing required.

Playback commands

AddressArgEffect
/lfo/<id>/start—Start this LFO
/lfo/<id>/stop—Stop this LFO
/lfo/<id>/sync—Reset this LFO's phase to zero crossing

Lane control commands

AddressArgEffect
/lfo/<id>/target/<name>/enable—Enable a named lane
/lfo/<id>/target/<name>/disable—Disable a named lane
/lfo/<id>/target/<name>/toggle—Toggle a named lane

Lane names are the single-word OSC identifiers assigned to each lane, shown in the lane header and in the LFO Cues modal.

1-Shot commands

AddressArgEffect
/lfo/<id>/oneshot/on—Enable 1-Shot
/lfo/<id>/oneshot/off—Disable 1-Shot
/lfo/<id>/oneshot/toggle—Toggle 1-Shot
/lfo/<id>/oneshot/cyclesfloatSet cycle count + enable 1-Shot
/lfo/<id>/oneshot/secsfloatSet duration in seconds + enable 1-Shot

Global commands (no <id> — these hit every module at once)

AddressArgEffect
/lfo/start—Start all LFOs
/lfo/stop—Stop all LFOs
/lfo/sync—Sync all to zero crossing
/lfo/gostring (optional)Sync all running LFOs to zero crossing; optionally pass a QLab cue name
/lfo/quit—Graceful shutdown

QLab → LFO Amplitude/Rate Control

Two more incoming addresses exist for real-time control from QLab, beyond what the commands above cover:

AddressArgEffect
/lfo/<id>/amplitudefloat 0.0–1.0Continuous multiplier applied to the LFO's output every tick
/lfo/<id>/ratefloatSets rate directly in Hz, clamped 0.001–8.0

Amplitude is a live multiplier, not a one-shot value — it scales every tick's output for as long as it's set, the same way a fader on a mixer scales a signal. Ride it from a QLab Network Cue inside a fade group: drive it from 1.0 to 0.0 and the LFO winds down in place, phase-coherent, instead of snapping to zero the way stopping the LFO outright would. Bring it back to 1.0 and the automation resumes exactly where it left off.

Rate works the same way the Rate slider does — it's the identical underlying value, so a message here also moves the visible slider in the LFO module in real time. It just gives QLab a way to reach that slider without you touching the app.

Neither has a dedicated field anywhere in the LFO Rack UI — these are raw-OSC-only, typed by hand into a Network Cue. One behavioral note worth knowing before you rely on amplitude for a fade: at amplitude = 0, the wave signal is scaled to zero before it's mapped onto the lane's configured range, so the fader parks at the exact midpoint of that range — not wherever the Offset knob has it centered. Offset gets scaled to zero right along with everything else.

QLab Fader Address Reference

Address format:

/cue/<name_or_number>/level/<output>/<input>

Output and input are zero-indexed channel numbers. Example: /cue/Scene_1/level/0/1 controls the crosspoint at output 0, input 1 of the cue named "Scene_1."

Strong recommendation: use Fader Detect rather than building these by hand. QLab's channel numbering isn't always obvious from the UI — it varies by cue type and by the routing matrix — and Detect reads the exact indices straight from QLab.

Two convenient details: cue names with spaces work fine (QLab handles them), and cue numbers (plain integers) work anywhere a name does.

QLab Rate Address Reference

The full trade-off lives in The /live Suffix above. The short version:

One gotcha worth repeating: a /live rate address only affects cues that are playing at the moment the message arrives. The cue's stored rate updates regardless of /live — it's the live playback speed that requires the cue to be running.

QLab Object Address Reference

Object addresses target spatial audio objects — the named "yellow dot" point sources in a QLab audio map. They're not cues, files, or channels; they're addressable spatial points you name in QLab. There is no Detect for objects (QLab won't broadcast their positions back), so these are addresses you'll type by hand.

There are two address families:

Cue-level — use this for real-time LFO control:

/cue/<cue_number>/audioMap/object/<name>/position/live x y

Affects the object inside a specific running cue. Does not persist beyond that cue.

Workspace-level — global, persists in the project:

/settings/audio/map/<map_name>/object/<name>/position/live x y

Affects the map definition globally. Use this for permanent positions, not continuous LFO motion — you don't want that baked into the saved project.

Position

AddressArgsNotes
.../position/live x yfloat floatReal-time XY — use this for LFO
.../position x yfloat floatPersistent (saves to undo stack)
.../position/x/live xfloatX axis only, real-time
.../position/y/live yfloatY axis only, real-time

Coordinate range: ±500 on both axes. Access level required: Edit in QLab — without it, position messages are silently rejected, a common "why isn't it moving?" culprit.

Spread

AddressArgsNotes
.../spread/live nfloatReal-time spread
.../spread nfloatPersistent spread

Range: 0 to 2× the largest map dimension. Cue-level spread is not confirmed in the QLab OSC dictionary — use workspace-level spread for reliability.

Wildcards

QLab evaluates wildcard patterns in OSC addresses server-side, on its own end — a single message can address several objects at once.

PatternMeaning
*Match any object name
[2-6]Match objects named 2, 3, 4, 5, or 6
*BMatch any name ending in B
/cue/1/audioMap/object/*/position/live x y ← all objects /cue/1/audioMap/object/[2-6]/position/live x y ← objects 2 through 6

Type wildcards directly into an Object lane's address field — they pass through to QLab unchanged. Smart move before a show: test the pattern on a lane with an editable address field (Fader, Rate, or Object) first, to confirm it resolves to the objects you expect before you trust it live.

Using Network Cues to Drive LFO Rack

Configure rate, depth, shape, and target address in the LFO Rack UI before the show. Then use Network Cues to automate timing:

#Network Cue addressArgEffect
1/lfo/lfo1/oneshot/cycles4Set 4-cycle limit and enable 1-Shot
2/lfo/lfo1/target/Scene1-Fader/enable—Enable the lane targeting Scene 1
3/lfo/lfo1/start—Start; LFO runs 4 cycles and stops automatically
Note — rate, depth, shape, and target address cannot be changed via these commands; configure them in LFO Rack's UI before show time. (The amplitude/rate control addresses above are the one exception for rate.)

Setting this up in QLab:

The big win: you parameterize LFO behavior per scene from inside your QLab workspace, without ever touching the LFO Rack window during the show. The rack becomes just another instrument your cue list drives.

Bandwidth Cautions

OSC is fast, but QLab has a ceiling. Picture QLab's OSC input as a doorway: any single message walks through easily, but a whole crowd rushing it at once jams the opening — and unlike a real doorway, QLab may freeze rather than merely slow down. Respecting the limits keeps your show solid.

Practical limits:

What happens as you approach the limit: LFO Rack watches rising load through its BW% chip and automatically begins thinning — sending fewer messages, spaced further apart. Smooth shapes (Sine, Triangle, Sawtooth, Rev Saw, Rnd Smooth) visibly quantize into steps. You'll see this in the canvas preview before you ever hear a problem. Square and Rnd Sharp are unaffected, because they were already step-like.

Recommended for bandwidth-tight shows: turn on the step qualifier for whichever shape you're already using and dial its resolution down to what you actually need. It costs a fraction of a full continuous curve's bandwidth and gives you exact control over how many updates per second you generate, instead of leaving the trade-off entirely to the automatic thinner.

Don't push past what your system has tested clean. The real ceiling shifts with Mac performance, QLab's cue count, and network conditions — treat these numbers as a safe default, not a hard guarantee.