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.
Five steps to live automation. If you know QLab, you'll be running quickly.
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.
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.
Under the LFO Module, click the + Fader button. A new Fader unit appears.
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.
Click ▶ on the LFO module. The waveform animates and values stream to QLab in real time.
Three controls to start with:
Click Save As in the toolbar and navigate to your QLab folder. LFO Rack saves your configuration as a .lfo_rack file.
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.
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.
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.
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.
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 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.
All seven shapes share the same rate, depth, and skew controls; what changes is the character of the motion.
| Shape | Character | Bandwidth |
|---|---|---|
| Sine | Smooth, natural, organic — the classic LFO shape. | Highest under load |
| Triangle | Linear rise and fall with sharp peaks. Mechanical and precise; equal time going up and down. | High |
| Square | Instant switching between two values — on/off, A/B. Sends almost nothing while the value is stable. | Lowest |
| Sawtooth | Ramps up, then snaps back down. | High |
| Rev Saw | The mirror image: ramps down, then snaps back up. | High |
| Random Sharp | Jumps to a new random value on every step. Generative and unpredictable. | Low |
| Random Smooth | Glides 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 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.
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.
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.
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.
Color: orange. Automates a single QLab audio fader or crosspoint.
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.
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.
/cue/{N}/object/{name}/position, i.e., "/cue/135/object/A/position" where cue name 135 and object name is A or B as shown in QLab's Object tab.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.
/Live button (see OSC /live below).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.
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.
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.
[LFO], or whatever text you want to add to the beginning of the targeted Qlab cue, to each matched cue's name. Cues already tagged are skipped.colorName OSC message to each matched cue. Choose from 8 QLab colors, or the hollow dashed circle to clear the color back to none. The color checkbox enables or disables coloring independently of tagging.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.
| Cue | Address | Arg | Effect |
|---|---|---|---|
| 1 | /lfo/lfo1/oneshot/cycles | 4 | Set 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:
| Address | Arg | Effect |
|---|---|---|
/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/cycles | float | Set cycle count + enable 1-Shot |
/lfo/<id>/oneshot/secs | float | Set 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.
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.
| Key | Action | QLab OSC address |
|---|---|---|
| Space | Go — play the next cue | /go |
| v | Preview the selected cue | /cue/selected/preview |
| s | Stop the selected cue | /cue/selected/panic |
| p | Pause the selected cue | /cue/selected/pause |
| [ | Pause all | /pause |
| ] | Resume all | /resume |
| Esc | Panic — 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) | — |
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.
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.
| LED | BW% | What's happening |
|---|---|---|
| Green | 100% | No thinning — full rate |
| Yellow | 50–99% | Mild thinning — barely noticeable |
| Orange | 17–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.
Every parameter, every control, every edge case. For the "why," see the Guide.
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.
Runs across the top of the window: connection fields, save/module controls, and live bandwidth/OSC/Live indicators.
| Control | Description |
|---|---|
| Workspace | QLab workspace name, case-sensitive. Turns green when connected. |
| Host | IP address of the QLab machine. 127.0.0.1 for same Mac. |
| Port | OSC receive port. QLab default is 53000. |
| Passcode | Optional. From QLab Settings → Network. Leave blank if using OSC Access without a passcode. |
| PLAY ALL / STOP ALL | Two 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% chip | Available 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 indicators | Flash on each OSC message sent to / received from QLab. |
| Max OSC | Message-per-second budget BW% is measured against. Fixed 600 msg/s (not adjustable). |
| LIVE indicator | Small 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.
| Control | Description |
|---|---|
| ⠿⠿ handle | Drag to reorder LFO modules. |
| Module name | Click to rename. |
| OSC ID | Short identifier used in incoming OSC addresses (e.g. lfo1). Shown in the LFO Cues modal. |
| ▶ / ■ | Play / Stop the LFO engine. |
| Rate | Log-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. |
| Offset | Shifts the waveform positive or negative relative to the center line. |
| Shape selector | Seven 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 button | Enable auto-stop mode — see 1-Shot Mode. |
| Canvas | Live 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.
| Shape | Description | Shape Parameter | Bandwidth |
|---|---|---|---|
| Sine | Smooth sinusoidal. | Skew (phase-warp asymmetry). | High |
| Triangle | Linear rise and fall, sharp peaks. | Angle (peak position / ramp curve). | High |
| Square | Instant min/max switch. | Pulse Width. | Low |
| Sawtooth | Ramps up, snaps back down. | Ramp Curve. | High |
| Rev Saw | Ramps down, snaps back up. | Ramp Curve. | High |
| Rnd Sharp | Jumps to a new random value each step. | Span (amplitude of each jump). | Low |
| Rnd Smooth | Glides 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.
A single secondary slider, repurposed per shape:
| Shape | Skew+ label | Effect |
|---|---|---|
| Sine | Skew | Phase-addition warp that shifts the peak earlier or later without breaking the smooth curve. |
| Triangle | Angle | Bows the otherwise-linear ramp and moves the apex. |
| Square | Pulse Width | Sets the duty cycle — how much of each cycle sits at max vs. min. |
| Sawtooth / Rev Saw | Ramp Curve | Bows the ramp concave or convex. |
| Rnd Sharp / Rnd Smooth | Span | Maps 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.
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.
| Control | Description |
|---|---|
| Qualifier toggle | Per-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 indicator | When 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.
Orange accent (#e8900a). Drives a single QLab fader (output crosspoint level).
| Control | Description |
|---|---|
| ⠿⠿ handle | Drag to reorder lanes within the module. |
| FADER→ | Go to the linked cue in QLab. Dims when no address is set. |
| Address field | OSC address, e.g. /cue/Scene_1/level/0/1. |
| /L badge | Inline clickable badge next to the address field's × clear button. Appends /live to this lane's address. See OSC /live Controls. |
| Fader Detect | Select cue in QLab → click → wiggle fader. Reads LINKED on success, persistently. |
| Phase offset | 0–360°. Shifts waveform timing. Sticky detents at 0° and 180°; double-click to toggle between them. |
| Curve mode | Crossfade (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>.
Teal accent (#5ab4c8). Drives a cue's playback rate.
| Control | Description |
|---|---|
| RATE→ | Go to the linked cue in QLab. |
| Address field | OSC address, e.g. /cue/N/rate. |
| /L badge | Same inline badge and behavior as Fader — appends /live. |
| Rate Detect | Select cue → click → wiggle the Rate slider in QLab's Time & Loops panel. Threshold 0.05×. LINKED persists once detected. |
| 1× button | Immediately sends rate = 1.0, bypassing the LFO. |
| Range slider | Min/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.
| Variant | QLab UI update | Undo queue | Works on stopped cues |
|---|---|---|---|
/cue/N/rate | Yes | ~120 entries/min | Yes |
/cue/N/rate/live | No | None | Only 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.
Sage accent (#7aaa6a). Drives a row of QLab faders/crosspoints from one waveform.
| Control | Description |
|---|---|
| Cue field | QLab cue name or number. Supports wildcards (*, [N-M]). |
| Detect Cue | Persistent button on row 0 (openDetectModal) — same detect mechanism as Fader/Rate/Spatial. Select cue → click → wiggle a fader. Reads LINKED persistently once linked. |
| Col start | Starting column (crosspoint) index. |
| Col count | Number of columns to drive. Default 12. |
| Skip | Comma-separated column indices to exclude. |
| Direction toggle | CW / CCW sweep direction. |
| Mode selector | Six modes — see below. |
| Cycles / Fulcrum / Pulse | Relabels to FULCRUM in Seesaw, PULSE in Soundcheck. |
| Row count | Number of output rows, 1–9. |
| Per-row enable, PHASE, DEPTH, OFFSET, INVERT | Same 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 button | No 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 mode | New 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.
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.
| Control | Description |
|---|---|
| Shape buttons | Circle, Oval, H-Line, V-Line. |
| → cue-jump label | Replaces 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 Detect | Renamed from plain "Detect" to match Fader lane naming. Select cue → click → wiggle a fader. Reads LINKED persistently once linked. |
| Curve mode | Xfade / Eq.Pow / Linear — same taper behavior as Fader lane curve modes. |
| Loop/Bounce toggle | Single 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 toggle | Single button (was two mutually-exclusive buttons). Sets sweep direction. |
| /Live button | No 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 slider | Zooms the canvas. Range 12.5%–100%, default 60% (was 80%). |
| Radius slider | Scales the radius of all visible output dots. |
| Output dot positions | Drag dots on the canvas to place each channel. |
| Active channel checkboxes | Enable/disable individual output channels. |
| FLOAT button | Renamed 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).
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 control | Description |
|---|---|
| Enable toggle | Independent 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 badge | Per-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 buttons | Circle 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. |
| START | Phase offset, 0–359° — sets where the sweep begins. |
| Loop / Bounce (Line only) | Loop: continuous sweep. Bounce: sweeps back and forth. |
| INIT | Reset 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.
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 type | Control shown |
|---|---|
| Fader, Rate | Inline /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). |
| Multi | Labeled /Live button (no address field to badge). Also colors each per-row "row card" border red when active. |
| Spatial | Labeled /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.
| Control | Description |
|---|---|
| ⚄ Randomize | Sets Wobble and Bounce to random values between 10–80%. |
| Wobble slider | 0–100%. Random walk on the per-tick rate multiplier. Double-click resets to 0. |
| Bounce slider | 0–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.
| Control | Description |
|---|---|
| 1-Shot button | Toggle enable/disable. |
| Cycles ⇄ Secs | Orange tint = Cycles mode. Teal tint = Secs mode. |
| Value input | Cycle count or seconds, depending on active mode. |
| Countdown display | Secs 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.
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.
| Control | Description |
|---|---|
| ↗ QLab Cues | Per-lane button. Opens the target modal for that lane — OSC addresses and Create in QLab. |
| ↗ LFO Cues toolbar | Opens the module-level panel — Start, Stop, Sync, 1-Shot, and lane Enable/Disable addresses. |
| Enable / Toggle checkboxes | Select which cues to create. Enable turns the lane on; Toggle flips its state. |
| Create in QLab | Sends 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.
QLab menu → Mark LFO Cues… — scans all linked lanes for cue numbers and sends rename and/or color commands to those cues in QLab.
| Control | Description |
|---|---|
| Tag checkbox | Appends [LFO] to each matched cue's name. Already-tagged cues are skipped. |
| Set cue color | Sends a colorName OSC message. 9 solid colors plus a hollow circle (None = clear color). |
| Color checkbox | Enables/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.
| Control | Description |
|---|---|
| Save As | Opens 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. |
| Autosave | 2 seconds after any change, silently overwrites the current file. Only runs once a file has been saved. |
| Backups | Within 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 Startup | Generates 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 | Object | |
|---|---|---|
| What it controls | QLab faders (via proximity math) | QLab audio object position (X/Y) |
| Mechanism | Yellow dot moves on a canvas; proximity to output dots drives fader levels | Sends position coordinates to QLab's spatial engine |
| Best for | Surround panning via a QLab fader matrix | Atmos / spatial plugin objects |
| Detect available | Yes (Fader Detect) | No — QLab doesn't push object position via OSC |
| QLab access level | Control | Edit |
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.
Concept and workflow: see Trial & Buying and Activating a License in the Licensing section above.
| Control | Description |
|---|---|
| Logo / About LFO Rack | Opens the Credits modal — app info, version, and a Buy a License card above the User Manual button. |
| Buy a License card | Opens 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 field | Paste 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. |
1. LFO is playing but QLab fader isn't moving
2. Workspace name won't turn green
3. Fader Detect captures the wrong cue
4. Rate lane is not affecting playback speed
/rate/live only controls active cues./rate) updates, but live speed control takes effect only once the cue starts.5. BW% drops quickly with few LFOs active
6. 1-Shot stops too soon (Secs mode)
7. macOS blocks LFO Rack from opening
8. Object position not responding to OSC
/live variant of the address for real-time control.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.
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.
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."
| Segment | Meaning |
|---|---|
cue | the kind of QLab object |
Scene_1 | the specific target, by name |
level | the parameter type (a fader crosspoint) |
0/1 | the output / input indices |
/lfo/lfo1/start — read as: the start command for LFO module "lfo1" inside LFO Rack.
| Segment | Meaning |
|---|---|
lfo | LFO Rack's namespace |
lfo1 | the module's OSC ID |
start | the 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.
OSC messages carry a typed value alongside the address, so the receiver knows how to interpret it. LFO Rack sends two kinds:
0.75, -327.4, or 1.0. The workhorse: fader levels, positions, rates.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.
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 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
| Address | Arg | Effect |
|---|---|---|
/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
| Address | Arg | Effect |
|---|---|---|
/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
| Address | Arg | Effect |
|---|---|---|
/lfo/<id>/oneshot/on | — | Enable 1-Shot |
/lfo/<id>/oneshot/off | — | Disable 1-Shot |
/lfo/<id>/oneshot/toggle | — | Toggle 1-Shot |
/lfo/<id>/oneshot/cycles | float | Set cycle count + enable 1-Shot |
/lfo/<id>/oneshot/secs | float | Set duration in seconds + enable 1-Shot |
Global commands (no <id> — these hit every module at once)
| Address | Arg | Effect |
|---|---|---|
/lfo/start | — | Start all LFOs |
/lfo/stop | — | Stop all LFOs |
/lfo/sync | — | Sync all to zero crossing |
/lfo/go | string (optional) | Sync all running LFOs to zero crossing; optionally pass a QLab cue name |
/lfo/quit | — | Graceful shutdown |
Two more incoming addresses exist for real-time control from QLab, beyond what the commands above cover:
| Address | Arg | Effect |
|---|---|---|
/lfo/<id>/amplitude | float 0.0–1.0 | Continuous multiplier applied to the LFO's output every tick |
/lfo/<id>/rate | float | Sets 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.
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.
The full trade-off lives in The /live Suffix above. The short version:
/cue/N/rate → LFO Rack dual-sends automatically (60 Hz to /live, 2 Hz to the UI). This is the default, and what you want most of the time./cue/N/rate/live → zero undo entries, no UI update, affects only currently playing cues.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.
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
| Address | Args | Notes |
|---|---|---|
.../position/live x y | float float | Real-time XY — use this for LFO |
.../position x y | float float | Persistent (saves to undo stack) |
.../position/x/live x | float | X axis only, real-time |
.../position/y/live y | float | Y 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
| Address | Args | Notes |
|---|---|---|
.../spread/live n | float | Real-time spread |
.../spread n | float | Persistent 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.
| Pattern | Meaning |
|---|---|
* | Match any object name |
[2-6] | Match objects named 2, 3, 4, 5, or 6 |
*B | Match 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.
Configure rate, depth, shape, and target address in the LFO Rack UI before the show. Then use Network Cues to automate timing:
| # | Network Cue address | Arg | Effect |
|---|---|---|---|
| 1 | /lfo/lfo1/oneshot/cycles | 4 | Set 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 |
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.
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.