DJ Waveforms
A DJ-style performance layer for Ableton Live: moving waveforms, deck transport, hot cues, loops, a track library, a mixer, and MIDI + keyboard control - all speaking to Live in real time.
What it is
DJ Waveforms turns the audio tracks of an Ableton Live set into DJ decks. Each deck shows a scrolling, beat-aligned waveform of the clip playing (or parked) on that track, coloured by frequency content: red for bass, green for mids, blue for treble. You play, pause, cue, loop, jump, and nudge each deck; the app applies everything to Live itself, so what you hear always comes from Live's own audio engine.
Because Live is the engine, the classic hard problems of DJ software simply do not exist here: every warped clip follows the one project tempo, so decks are always in sync by construction, and EQ, filters, effects, routing, and recording are all whatever you build in Live. DJ Waveforms adds the performance surface Live is missing.
Requirements
- Ableton Live 11 or 12. Any edition. Your DJ tracks live as warped audio clips in the set's Session view, one track per deck.
- macOS 11 or newer, or Windows 10 / 11.
- The AbletonJS Control Surface (also called the Remote Script). It ships inside DJ Waveforms - nothing to download. The app copies it into Live for you; you enable it once in Live's preferences (see First run).
The app is local-only: it talks to Live on your machine and is never reachable from the network. No internet is needed at a gig (see License - activation needs the internet once).
First run and setup
- Launch DJ Waveforms. The window opens immediately, even if Live is not running, and shows "Waiting for Live...".
- Install the bridge (first time only). If the Remote Script is not installed, after a few seconds the center of the window offers an Install Remote Script button (also available in Settings under "Live connection"). Click it - the app copies the AbletonJS script into Live's User Library Remote Scripts folder.
- Enable it in Live (first time only). In Live: Preferences > Link/Tempo/MIDI, set any free Control Surface slot to AbletonJS, and leave its Input and Output on None - it talks to Live over its own connection, not over MIDI. Then restart Live. This step is manual because Live has no way to automate it.
- Open your Live set. The app connects automatically - the status pill turns green ("live") and your audio tracks appear as decks.
From then on, launching the app while Live runs (or starting Live while the app runs) connects on its own. Keyboard shortcuts work out of the box: the first run installs an editable "Keyboard shortcuts" mapping with Serato-style defaults (see Keyboard shortcuts).
Where the script goes
| OS | Location |
|---|---|
| macOS | ~/Music/Ableton/User Library/Remote Scripts/AbletonJS |
| Windows | Documents\Ableton\User Library\Remote Scripts\AbletonJS (OneDrive-redirected Documents is detected) |
AbletonJS folder into your real Remote Scripts folder by hand - the app only needs it to be where Live looks.Your Live set
DJ Waveforms does not need a special project. It works with any Live set - your usual template, racks, groups, sends and routing all stay exactly as they are. The app reads whatever set is open in Live and builds its interface from it:
- Decks come from audio tracks. The first audio tracks of the set become the decks, left to right, up to the DECKS count in the header (3 by default, 1-16). MIDI tracks, group tracks and return tracks are skipped - only audio tracks count, so deck 2 is the second audio track even if a group or MIDI track sits between them.
- The deck order is Live's track order. Decks cannot be reordered inside the app - they always mirror the set. To change which track is deck 1, move the tracks in Live; the app follows along.
- Each deck plays the clip on its track. Put your songs as warped audio clips in Session view. Warp every track properly (Complex Pro recommended for full songs) - the library's Status column warns about unwarped or messy-warped clips.
- Mixer knobs come from your racks. Each deck's channel strip picks up the macro knobs of the first Audio Effect Rack on that channel - put your EQ, filter or FX in a rack, map them to macros, and they appear as that deck's knobs. A channel without a rack simply shows a strip with fader and meter only. Right-clicking a knob remaps it to any other macro on the same channel or to a send - see Mixer.
The interface
Top to bottom: the header (tempo, snap, and the icon row), the deck area (sidebar rail + waveform lanes, with the optional mixer column between them), the optional library drawer at the bottom, and the status bar.
Header
- BPM - Live's tempo. Drag right or up for faster, left or down for slower (the vertical axis gives a long throw even though the readout sits at the top of the window); hold Shift for fine adjustment.
- SNAP - the quantization grid used for launches and seeks. Drag to step through Live's values (Off, 8 Bar ... 1 Bar, 1/2 ... 1/32). This is Live's own clip-launch quantization.
- DECKS - how many decks are shown. Drag left/right to step the count (default 3, up to 16). With the Library closed the window resizes to fit; with it open the Library absorbs the change instead - removing decks gives the freed space to the track list, adding decks takes it back (the window grows only if the Library would drop below its minimum). Also mappable to a MIDI encoder or keys (Interface > "Decks shown").
- Icon row: Controls (show/hide the sidebar rail), Mixer, Library, Style (cycle the waveform look), Mapping (MIDI/keyboard mapping mode), the always-on-top pin, Settings, and - on Windows - a Fullscreen button (fill the screen; same as F11).
Hovering any control shows a short grey hint in the status bar instead of a tooltip.
Each deck
- Waveform lane - the scrolling wave with the playhead, bar grid, hot cue markers, and loop brace. Live's raw warp-marker ticks appear only in the grid editor (or always, via the Style panel's "Show Live warp markers").
- Rail panel (in the sidebar): track name, BPM and musical key (Camelot code, colour-coded), elapsed / remaining time and a next-cue countdown (remaining turns yellow under 60 s and red under 30 s), the overview strip (whole-track minimap - drag to scrub), transport buttons (Play, Stop, headphone Cue, Previous, Next, Unload), and the pad grid with its Cue / Jump / Loop mode switch. At the Small deck size the panel condenses to two rows - name and BPM, then one compact strip with Play, Stop, the overview stretched between them, and the key - so even the smallest decks keep transport and scrubbing.
Status bar
- Live pill (left): grey "offline" = the app is not running properly; "no signal" = Live not connected; green "live" = connected (pulses while playing).
- REC (next to the Live pill): click to arm Live's Arrangement recording - grey when off, red when armed, pulsing while actually recording. It also switches on Live's Automation Arm, so every fader, EQ, crossfader and tempo move you make - by hand or over MIDI - is captured as automation. Play a deck and Live records the whole performance into the Arrangement; click REC again to stop arming. If the Arrangement already has recorded material, arming does not overwrite it: the playhead moves to the bar after the last event so your new take appends after it, and a "New mix" locator is dropped at the start (if you have already positioned Live's playhead past the material, it records from there instead). Mappable to a key or MIDI control (default Ctrl+N, matching Serato).
- Center: hover hints (grey), notices (white), and warnings (yellow). Sticky messages show while a quantized stop is pending or a track is analyzing.
- Update Available (right, just left of the version): a gold link that appears when a newer version is ready and "Check for updates" is on (see Updates) - click to open the download page.
- Version (right): the build number.
Transport and the launch model
Everything transport-related is quantized to the SNAP grid, exactly like launching clips in Live. Understanding this makes the app predictable:
- Play on a parked deck starts exactly at the parked position, on the next grid boundary. The app pre-stages the launch the moment you cue or pause, so pressing Play is instant - stab it on the beat and it lands on the beat.
- Play on a playing deck pauses it at the next boundary (the button pulses while the action is pending).
- Stop stops at the boundary and parks the deck back at its start: the first cue point (with "Load to the first cue point" on), else the first bar of the beatgrid - ready to launch on-grid again.
- Relocating a playing deck (drag, overview scrub, cue jump) lands on the boundary too: you will see a "water fill" rise toward the target while the current audio keeps playing - that is the pending quantized action.
- Esc cancels a pending quantized action (a pending pause/stop is re-fired so the deck keeps rolling). Launches and track swaps are not cancellable - they will land at the boundary.
- SNAP Off disables quantization: seeks apply immediately (with a short natural latency from Live).
Waveform control
| Gesture | Effect |
|---|---|
| Drag the waveform | Grab: carry the wave to a new position. On release the target bar is grid-snapped and the deck relocates (quantized while playing, instant while parked). |
| Hold Shift while dragging | Nudge: phase-shift a playing deck by hand, unquantized and fine-grained - the vinyl-style way to beat-match by ear (momentary: the next grid-snapped action re-asserts the grid; to fix a wrong grid permanently, use the grid editor). On a parked deck this places the cue exactly, without snapping. Also mappable per deck (MIDI/keyboard: "Nudge"). |
| Right-click and drag up/down on the waveform | Resize the waveform height (all decks follow). |
| Drag the overview strip | Scrub through the whole track; hold Shift for fine sensitivity (works mid-drag). Right-click the overview to flip every minimap to the colour-map (Flat) look - track colour with the cue sections inked - so you can read a section-coloured overview off your cues while the main waveforms stay on any style. Right-click again to return them to the current style. |
| Mouse wheel, or + / - | Zoom the waveform. Remembered across reloads. |
| Drag the deck-size divider (above the master bar, library open) | Step deck size XL / Large / Medium / Small (XL adds a fourth mixer knob row and a taller lane; Medium drops the pads, Small condenses to name/BPM plus a compact Play/Stop + overview + key strip). |
| Drag the window's bottom edge (library hidden) | Step the decks through the same S / M / L / XL sizes - the window snaps to the size you see when you let go. |
Hot cues
Eight hot cues per track, in the pad grid's Cue mode and as chips on the waveform.
- Empty pad: click to set a cue at the playhead (on a playing deck the position snaps to the grid).
- Filled pad: click to jump there - quantized while playing, immediate while parked (Serato pad semantics).
- Right-click a pad or a cue chip on the waveform - the same menu opens in both places: rename the cue, pick one of 16 colours, toggle Fill section (tints the lane from this cue to the next - great for marking intros, drops and outros), reset the colour, or delete the cue. On the Flat style a filled section also colours the waveform itself in the cue's colour, so the wave reads as a section map of the track.
- Rename also works by double-clicking a cue chip on the waveform.
- Shift-click a filled pad: left half toggles the section fill, right half deletes the cue.
Serato cues
Hot cues that Serato wrote into your files' tags are imported automatically, read-only: they appear with their Serato colours, can be hidden (the file is never modified), and shift-clicking the pad-mode button resets pads to the Serato originals.
Persistence
Cues, names, colours, and section fills are saved per audio file, keyed by an audio fingerprint - so they survive app restarts, file moves and renames, and re-warping. They are stored by the app (see Your data), never in the audio file and never in the Live set.
With the setting "Load to the first cue point" on (default), a freshly loaded track parks at its first cue, ready to launch from there. A track with no cues (or with the setting off) parks on the first bar of its beatgrid - never between grid lines, so a quantized launch always lands on the beat. A full stop returns the deck to the same spot. Unwarped tracks park at their very beginning (they have no grid).
Loops and beat jump
Loop pads
- Pad sizes: 1/4, 1/2, 1, 2, 4, 8, 16, 32 bars. Clicking sets a loop of that size at the playhead position, aligned to the grid - instantly, even mid-flight.
- Tapping the active size again exits the loop; tapping a different size resizes it. Loops also work on a parked deck (loop an intro before launching it).
- Exiting a loop keeps playing forward from where the loop was; resuming a parked loop launches phase-locked from the loop start.
Jump pads
- Sizes: back/forward 2, 4, 8, 16 bars. On a playing deck the jump is instant and phase-locked (no quantize wait). On a parked deck it moves the cue point.
- While a loop is active, a jump slides the whole loop together with the playhead - build-ups stay locked while you move the brace around the track.
The "Visually Repeat short loops" setting tiles a looping clip across the whole lane so short loops read like a continuous wave; turning it off draws the loop once.
Loop roll (slip)
A mappable "Loop roll" action per deck (map it to a controller pad or a key - it is not in the default map). Hold it to loop the current N bars in place (the bar size is set on the binding); release and the playhead jumps ahead to where the track would be if it had played straight through, then continues - a momentary roll that lands back in phase. Best on a pad in Hold mode.
Beatgrid tools
Everything in the app - launches, loops, jumps, sync - quantizes to the clip's warp grid in Live. When that grid is wrong, DJing falls apart. The Grid tools fix grids from inside the app, writing Live's own warp markers, so a track gridded once stays right everywhere.
The grid editor
Press Grid next to a deck's transport buttons (beside Snap) to open the grid editor; press it again to close. While it is open the waveform draws the grid as gold bar lines with bar numbers plus thin beat ticks, and every change redraws them instantly. Edits save as they happen - closing the editor by any route keeps them; only Cancel restores what you started with.
Fixing a track takes a drag and two taps:
- Drag the wave until a clear kick sits exactly under the playhead. In the editor a drag moves the deck freely - no snapping; hold Shift for extra-fine motion.
- Tap 1.1.1 - that kick becomes bar 1, beat 1, and the lines re-seat around it immediately.
- If the tempo is off, set the BPM (below). Then jump near the end of the track and check the far kicks still sit on the lines. If they drift, park the playhead exactly on a clear far kick and tap Align - the app counts the whole beats back to your downbeat and derives the exact BPM from the distance (a vinyl rip lands on its true 128.0913 in one tap; the downbeat never moves). The Shift BPM drag (below) does the same thing as a manual fine dial. If the tempo started far off, align once mid-track first, then again at the end.
- Press OK to close, or Cancel to put the grid back the way the editor found it.
The 8 pads:
- BPM - the grid tempo. Drag to change in whole BPM (where most tracks live), hold Shift for 0.01 steps; the lines follow while you drag. Double-click uses the file's BPM tag. Tempo changes pivot around the 1.1.1 downbeat - the reference you set stays put - so verify at the END of the track: when the far kicks sit on the lines too, it is exact.
- x2 / /2 - fix a half- or double-time grid in one tap.
- 1.1.1 - make the exact beat under the playhead the downbeat; the bars renumber from it. The track always keeps its full length: audio before the downbeat simply counts backwards from bar 1, and you can still scroll to it, cue in it and play from it.
- Align - the second grid point. Park the playhead on a clear beat well away from 1.1.1 and tap: the app snaps that spot to the nearest whole beat from the downbeat and re-derives the exact BPM from the audio distance. The downbeat stays put, and the beat under the playhead lands dead on a grid line.
- Undo - step back one grid change (the previous grids are saved with the file, so this works across sessions). Double-click re-applies the saved grid when the loaded copy differs from it.
- CANCEL - restore the grid the editor opened with, and close.
- OK - close the editor. Everything is already saved.
Playing deck: the glide
On a playing deck, dragging the wave in the editor becomes a smooth glide - the audio bends like a turntable pitch-bend while the beat clock stays locked, so you align it by ear against the other deck exactly like beatmatching. Release, and once the ramp plays through, the correction is written into the grid permanently. Beatmatching becomes grid repair. (The BPM and 1.1.1 pads want a parked deck - pause first, or use the glide.)
Checking grids from the Library (Analyze)
The Library's Analyze button checks beatgrids as part of its normal pass: for each track it caches the waveform and detects the file's BPM and downbeat from the audio, then cross-checks three sources - the detection, the file's BPM tag, and Live's current grid. Select rows first to analyze just those (the button reads "Analyze 12"); with nothing selected it runs over the whole library. Nothing changes during the run:
- Tracks whose grid already agrees with the consensus are marked as verified (green Status dot).
- Tracks where the grid is off but the detection is confident get a ready fix - their Status dot turns orange and an orange Apply N button appears next to Analyze. Press it to fix them all in one go (cues and loops ride along; a track that was not warped at all gets warped in Complex Pro). Ignore dismisses the fixes instead - the app remembers, and only re-proposes if a track actually changes. Right-click a row for the same per-track actions: Analyze track, Apply grid fix, Ignore grid fix.
- Tracks where the sources disagree are flagged for your ears (amber dot, "Review"): load one to a deck, open the grid editor, drag a kick under the playhead and tap 1.1.1.
Unwarped tracks on a deck
A track playing unwarped shows itself honestly: time readouts count real seconds, BPM reads "-" (it plays at its natural tempo), and the wave draws no beat grid. The needle still goes wherever you put it: drag the wave or scrub the minimap to park or relocate, tap cues to jump, pause and resume exactly where it froze - every placement is exact, because there is no grid to snap to. Launch timing follows the SNAP setting like any other deck, and relocating a playing unwarped track retriggers it at the new spot. The clip itself is never touched: the app will not warp it, and everything is restored when the deck stops or unloads. What an unwarped track cannot do is beat-based work - beat jumps, loops, hand-nudge, and the grid editor need a warped clip, so they are dimmed with a hint. To make the track mixable, drop it from the library again and pick Warp + beatgrid.
Saved grids: never grid a track twice
Every grid edit saves the grid under the file's audio fingerprint - the same identity hot cues use. Live keeps its own per-file analysis cache (.asd), so re-adding a file can bring an old grid back; when that happens the BPM pad shows the mismatch and double-clicking Undo restores your saved grid. The set itself only changes when you act - the app never rewrites a grid on its own.
Grid changes go into Live's undo history as regular edits, and the previous grids are kept per file (the Undo pad steps back through them). Save your Live set to keep applied grids.
Library
The library (header icon, or B) lists every audio clip in your Live set as a track list, independent of which deck it is on.
- Getting tracks in: they are scanned from the open Live set. "Rescan" re-reads the set; the list also refreshes when the set's tracks change. You can also drag a file from Finder/Explorer or from Live onto a deck - if the file exists in the set it loads (otherwise: "Dropped clip isn't in this Live set - try Rescan").
- Columns: #, colour, Title, Artist, BPM, Key, Energy, Genre, Comments, Length, warp Status. Sort by clicking a header; Shift+click a second header for a secondary sort that breaks the first one's ties (BPM then Key, for example - shown with a smaller arrow). Resize, reorder, or right-click the header row to show/hide columns. Double-click a cell to edit Title, Artist, BPM, Key, Genre, or Comments - edits are yours (saved by the app, not written into the file or the set). Double-click the colour swatch to recolour the clip in Live; the picker's "Original color" row (bottom) reverts to the colour the clip had before you first recoloured it.
- Energy: a 1-10 energy level you assign per track - double-click the Energy cell and click a number (coloured cool to hot); Clear removes it. Sortable and remembered like any other edit.
- Multi-select: click selects a row, Shift+click selects the range from the last click, Ctrl/Cmd+click adds or removes single rows, Ctrl/Cmd+A selects everything in view, Esc (or a click in the empty space) clears. The count line shows how many rows are selected.
- Bulk edits: with several rows selected, editing a cell of any selected row applies the value to all of them - set the colour, energy, genre, artist, key, BPM or comment of a whole group in one go (a status-bar note confirms how many tracks it applies to). Title stays per-track. Right-clicking a selected row offers "Mark N as played / unplayed" for the whole selection. Dragging a selected row moves the entire selection as a block when reordering (sorted by #, filters clear); dropping it on a deck loads just the grabbed track.
- Search and filters: search across title/artist/key/genre; filter by Camelot key, BPM range, and Tracks/Loops (click Tracks or Loops to show only that kind; click it again to show both). Any control that is actively narrowing the list turns blue - a soloed Tracks/Loops or Unplayed/Played chip, a chosen key, a set BPM bound, an engaged Match - so you can always see at a glance why rows are missing. The Key column shows Camelot codes (8A, 12B ...) colour-coded around the wheel for harmonic mixing. A mappable "Focus search" action (map a key or pad) opens the panel and jumps to the search box.
- Unplayed / Played: the same solo-style toggle for your night. Unplayed hides everything you already played - the "what's left" view for picking the next track. Played shows only played tracks, ordered by when you played them: a live set list. It lands on the # sort (the play order); sorting by another column still works as a temporary view, and # returns to the play order. Marking a row unplayed removes it from the set list (and puts it back in Unplayed); the list is a history, so drag-reordering is off while the filter is active. Click the active chip again to show everything.
- Match: one click filters the list to tracks that mix with the playing deck - a compatible key (the same, neighbouring, or relative Camelot key) and a tempo within 8% (half and double time count). When nothing is playing it matches against the selected row instead, so you can explore "what goes with this?" while preparing. The count line shows what it is matching against.
- Custom order: with the # column sorted and filters clear, drag rows to build your set order (a magnetic insertion line shows the drop). The order persists across sessions.
- Load to a deck: drag a row onto a deck (lane, rail panel, or mixer strip), or right-click the row for "Load on Deck N". Loading onto a playing deck launches the new track at the quantize boundary ("load and go"). The Settings guard "Do not load to a playing deck" blocks such loads instead when enabled.
- Unwarped tracks: dropping a track that is not warped in Live asks right at the pointer - Play unwarped (load it as it is, for an ambient bed at its natural tempo) or Warp + beatgrid (the app detects the tempo and downbeat, warps the clip in Live, writes a proper beatgrid, and only then loads it - the library row and every future load agree). Pressing Esc or clicking away cancels the load. If detection was unsure the row is marked amber for review - check it in the grid editor. MIDI/keyboard loads skip the prompt and load unwarped.
- Tracks warped in a lesser mode: dropping a track whose Status says "Not Pro" (warped, but not in Complex Pro) asks the same way - Play as is (keep the warp mode it has) or Switch to Complex Pro (the same change as the row's right-click action, applied to the source clip before loading). MIDI/keyboard loads skip the prompt and load as-is.
- Right-click fixes: rows also offer "Analyze track", "Apply grid fix" / "Ignore grid fix" (when Analyze found one), and "Warp in Complex Pro" for tracks warped in another mode - the Status dot updates the moment it is done.
- Status dots: one dot per track tells the whole story. Orange = a beatgrid fix is ready (press Apply - the button shares the colour). Red = not warped (and no fix ready). Amber = suspect: "Messy" (auto-warp with many markers), "Not Pro" (a warp mode other than Complex Pro), a BPM mismatch between Live and the file's tag, or a grid that needs your ears. Green = healthy (a verified grid says so in the hover). Hover any dot for the plain-English detail.
- Row highlights: a track that is loaded on a deck right now shows its title in blue, so you can see at a glance which rows are on the decks. A track a deck has actually played is dimmed - and the mark is remembered across restarts, so a crash or reload mid-set never loses track of what you already played. Right-click a row to mark or unmark it played, or to clear all played marks (say, at the start of a new night).
- Analyze: one pass per track - caches the waveform (so future loads are instant) and checks the beatgrid (see Beatgrid tools). Runs on the selected rows when any are selected, otherwise the whole library.
- Aa: row size (Compact / Normal / Large) and bold titles.
Mixer
The mixer column (header icon; on by default) shows a channel strip per deck plus a master bar. It controls Live's mixer and your racks - it adds no processing of its own. Build the sound in Live; perform it here.
Faders and meters
- Volume faders use the Smooth curve by default - gradual near the top, quick cut at the bottom, the classic DJ feel. A hardware MIDI fader mapped to a deck lands on the same values as the on-screen fader.
- Fader curve: right-click any volume fader (deck, master or cue) to pick a curve for all of them - Ableton (Live's own fader verbatim: linear in dB with 0 dB at 91% of the throw), Smooth (the default), Linear, or Fast (up quickly). The same menu sets the maximum level: Live's full +6 dB range, or 0 dB so the fader can never push past unity. MIDI faders follow the chosen curve too.
- VU meters are linear and match Live's meter scale. They have two colour schemes: the classic green / amber / red, and a warm scheme where the lower range glows gold, the upper range is white, and only the top is red. Click (or right-click) any VU meter to switch every meter between the two; the choice is remembered. Deck VUs are stereo (mono at small sizes).
- Master clip warning (setting, on by default): while the master level is past 0 dB the whole master meter turns red, not just the top segments - so clipping is impossible to miss mid-set. Turn it off (Settings > Mixer) to keep the classic red-tips-only look.
- Crossfader (in the master bar): double-click to recenter. It maps 1:1 onto Live's own crossfader, so the crossfader curve you set in Live is exactly what you hear.
Knobs
- Where they come from: each strip shows the macro knobs of the first Audio Effect Rack on that deck's channel - only macros that are actually in use. Group your EQ, filter and FX into a rack in Live and its macros become the deck's knobs automatically.
- Polarity is read from the macro's default: a macro that rests in the middle (EQ gain, filter) gets a bipolar centre-notch fill; one that rests at zero (an FX amount) fills up from the bottom.
- Right-click any knob to make it yours. The menu offers:
- Colour - 16 colours, or Neutral grey to clear the override.
- Map to - Auto / default, any macro of the same channel's rack, any send, or Unmapped. Right-click works on unmapped knobs too - that is how you bring one back.
- Polarity - force Bipolar (centre notch) or Unipolar when the automatic guess is not what you want.
- Invert control - the knob runs backwards (useful for a rack macro Live cannot reverse). MIDI follows the inversion too.
- Set current position as default - double-click will return the knob here instead of the macro's own default (Live racks cannot set that separately). The knob's value arc re-anchors too: it reads clean at the new default and fills outward from it when moved, so a customized deck looks tidy at rest. "Reset default position" clears it. (An explicit Polarity choice still wins over the arc anchoring.)
- Knobs follow your set: swap the rack or rename a macro in Live and the strip re-resolves and relabels automatically.
Snapshots
Snapshots capture the position of every knob on a deck - visible and hidden slots alike - and the master bar knobs (see "Snapshots include master knobs" below), and bring them back on demand: instantly, on the beat, or as a slow sweep. They live in a second pad row under the Cue / Jump / Loop pads, shown at the XL deck size (the row lines up with the fourth knob row). At the L deck size a SNAP button at the right end of the transport row swaps the pad section for the snapshot pads and MORPH; the same button (now reading CUE, in the same spot) swaps back. The coloured pads are snapshots; the small knob on the right is MORPH.
- Capture: click an empty slot. The deck's current knob positions are stored in that slot. Snapshots belong to the deck (the channel and its rack), not to the loaded track - load a new song and they are still there.
- Fire: press a filled pad and the knobs move to the stored positions. Hold Shift and every filled pad splits in two, just like the cue pads: the left half (dial icon) maps that snapshot to the MORPH knob - the mapped pad's dial shows a pointer; the right half (x) deletes the snapshot.
- Right-click a pad for its options:
- Colour and Name - pick any colour (or Neutral blue) and a name. Snapshot pads always read in white text and rest at a darker shade of their colour, so they stay distinct from the brighter cue pads.
- Trigger - Instant press (the default) fires the snapshot and leaves it. A Hold pad applies the snapshot while you hold it and restores exactly where the knobs were before you pressed, either way you choose: Hold (instant restore) snaps them back the moment you release (a quick performance stab), Hold (glide restore) eases them back over the glide time. Hold pads carry a small corner mark.
- Quantized launch - the snapshot fires on the next clip-launch boundary (the same SNAP grid your decks launch on). The pad blinks while it waits; pressing it again cancels. With the transport stopped it fires immediately.
- Glide - instead of jumping, the knobs sweep to the snapshot over 1 to 32 beats (tempo-synced). The whole pad fills with its brighter colour as the sweep progresses. On a Hold snapshot the glide always eases the knobs in on press; the release snaps back at once unless the pad is set to Hold (glide restore), which eases them back out too - and its fill reverses from wherever it had reached.
- Update to current knobs - re-capture into the same slot, keeping the name, colour and settings.
- Duplicate (into the next empty slot) and Copy to all decks (same slot on every deck - handy when your decks share one rack layout).
- MORPH is the manual version of glide. Assign a snapshot to it (shift-click the pad's left half, or right-click either the knob or the pad). From zero, turning the knob up blends every knob from where it was toward the snapshot; turning back to zero returns them exactly where they were. Double-click resets it to zero. Grabbing an individual knob mid-blend takes that knob out of the morph - your hand always wins. Firing any snapshot pad resets the morph.
- While something is in flight: turning a knob during a glide removes that knob from the glide and leaves the rest running; firing another snapshot takes over.
- In practice - a few moves the pieces add up to:
- The drop-back: capture your clean mix position in slot 1 and set it to Quantized launch. Twist the track as far out as you like - filter sweeps, crushed EQ, wild sends - then hit the pad and everything snaps back to clean exactly on the beat.
- Send throws: capture a snapshot that only cranks a send (delay, reverb, whatever lives on that return) and set it to Hold. Press for a momentary throw, release to land back where you were - several hold pads give you a different throw on each finger, across as many sends as your rack has.
- The long build: give a "peak" snapshot a 16 or 32 beat Glide and fire it at the start of a transition - the whole deck sweeps there in tempo while your hands stay free. MORPH is the same ride by hand, including easing back out.
- Master bar knobs ride along (setting: "Snapshots include master knobs", on by default): capturing a snapshot also saves the master bar's assignable knobs, and firing it sets them too - so each snapshot can carry its own master-rack sound (a master filter position, drive amount, and so on). Hold, glide, quantize and MORPH treat them exactly like deck knobs. Master volume, cue and crossfader are never captured. Turn the setting off (Settings > Mixer) to keep snapshots strictly per-deck; already-saved master values are simply ignored while it is off.
- Rack changes: snapshots apply by knob position, and a slot whose knob no longer matches what was captured (you swapped the rack) is skipped rather than pushed into the wrong macro. Recapture after a big rack change.
- MIDI and keyboard: each pad is mappable (Snapshot 1-8 per deck) - in Hold button mode the hardware pad behaves like a Hold snapshot (press applies, release restores) whatever the snapshot's own trigger setting; a normal press fires it, and toggles a Hold snapshot on and off. MORPH maps as a continuous knob. Snapshot moves are ordinary parameter changes, so with REC and automation arm they are recorded into your arrangement.
- Where they live: snapshots persist in
mixer.jsonnext to your knob mappings.
Master bar
- Master volume, cue (headphone) volume, crossfader, master VU, and assignable knobs that map to the master track's rack macros or to return-track racks (a return without a rack exposes its first device's own controls, so a stock Reverb's knobs are mappable too). Right-click works the same as on deck knobs.
- Drag the bar's top edge up for the wide layout with knobs, down for the slim bar. The bar sits under the library by default (Settings can move it between decks and library).
Headphone cue (PFL)
Each deck's headphones button in the rail solos that track as a pre-listen. This uses Live's Solo-in-place as PFL and requires Live's mixer to be in Cue mode (the option next to the master track); in plain Solo mode the app hides the headphone buttons.
Resize grips
Below the knobs, drag to expose more or fewer knobs; on the fader, drag to lengthen the fader/VU or switch mono/stereo metering.
Waveform styles
- Presets: Rainbow (default), Additive, Flat, Additive Bars - cycle with the header Style icon or pick in Settings > Style. "Save as" stores your own presets; Rename/Delete manage them; Reset restores a built-in.
- Rainbow paints each column from a six-stop designed spectrum - red bass, orange low mids, bright gold mids, emerald high mids, azure treble, violet air - with red reserved for bass-dominant hits and loud full-spectrum moments glowing toward white. The "Band colours" and "Spectrum colours" pickers set the six stops; "Broadband to white" sets the glow.
- Edit opens the style editor. Only the knobs that apply to the current preset's look are shown: shape and smoothing, band colours and balance, saturation/brightness, bar geometry (bar styles), overview height and contrast, warp-marker visibility and colour, playhead colour and width. Colour swatches open a picker beside the panel - drag on the square or the hue strip and the waveforms recolour as you move; below them sit a hex field and quick-pick swatches from the app's own palette.
- Spectral bands knobs (the bass/mid/treble crossover frequencies) recompute the analysis - expect a short pause per deck when you change them.
- Waveform height can also be set by right-click-dragging any waveform up or down. Overview height is set here in the editor (right-clicking the overview flips its colour-map look instead - see Gestures).
Keyboard shortcuts
Keyboard control is a virtual device ("Keyboard", shown in blue) inside the same mapping system as MIDI. A default Serato-style map is installed and enabled on first run, fully editable.
Default map
Deck 1 lives on the upper letter row, deck 2 on the home row, deck 3 (partial) on the bottom row. Keys are physical positions (US layout); on macOS Alt is Option.
| Action | Deck 1 | Deck 2 | Deck 3 |
|---|---|---|---|
| Play / pause | W | S | X |
| Stop | Shift+W | Shift+S | Shift+X |
| Previous / next track | Alt+Q / Alt+W | Alt+A / Alt+S | Alt+Z / Alt+X |
| Hot cues 1-5 | 1-5 | 6-0 | - |
| Clear hot cue 1-5 | Ctrl+Shift+1-5 | Ctrl+Shift+6-0 | - |
| Autoloop 1/2/4/8/16 bars | Alt+1-5 | Alt+6-0 | - |
| Loop on/off (4 bars) | [ | ' | - |
| Loop halve / double | O / P | K / L | - |
| Beat jump back / forward (4 bars) | Alt+E / Alt+R | Alt+D / Alt+F | - |
| Nudge back / forward (hold) | T / Y | G / H | - |
| Library and global | Keys |
|---|---|
| Select previous / next row | Up / Down |
| Page up / down | PgUp / PgDn |
| Load selected row to deck 1 / 2 / 3 | Shift+Left / Shift+Right / Shift+Down |
| Show / hide the library | B |
| Record (arm Arrangement recording + Automation Arm) | Ctrl+N |
| Tempo up / down 0.1 BPM | Shift+= / Shift+- |
| Zoom waveform (app built-in) | + / - |
| Cancel pending quantized action (app built-in) | Esc |
Holding a key auto-repeats where it makes sense (beat jump, loop halve/double, library navigation, nudge, tempo) and never for hot cues.
Remapping
Click the header Mapping icon, switch the floating pill to Keyboard (blue), click any highlighted control on screen, then press the chord you want. Press again to confirm a conflict; Delete clears a binding. The Manager button opens the full bindings table with every action (including ones with no on-screen control), where key chips can be edited per action and per size (the 1-bar and 2-bar loop pads are separate bindings). Keys can also drive knob targets in step / set / toggle modes (as percentages of the control's travel), and encoder targets - the BPM readout, the DECKS count, library scroll, nudge - as step keys: each press steps the value up or down (pick the direction in the Behavior column), and holding the key repeats. Deleting the "Keyboard shortcuts" map and re-enabling the device re-seeds the defaults.
MIDI controllers
Any class-compliant MIDI controller can drive the app. The MIDI engine runs in the background, so mappings keep working even with the window behind Live.
Mapping a controller
- Connect the controller and click the header Mapping icon. Mapping mode highlights every mappable control: unmapped = outlined ring, mapped = solid gold with a label.
- Click a control on screen, then touch the hardware control you want to bind. Learn auto-detects the control type: button, absolute knob/fader, or relative encoder (all three common encodings).
- Shift+click binds the shift layer - one global shift control (bind any button to "Shift") gives every other control a second function.
- Done or Esc leaves mapping mode. Clicking controls in mapping mode never actuates them - you cannot accidentally fire a deck while mapping.
The Manager
The Manager (button on the mapping pill) holds everything else: the device list (enable switch, activity blips, per-device mapping assignment), mapping files (New / Duplicate / Rename / Import / Export / Delete), the full bindings table grouped by deck/master/library/interface/global, a raw input Monitor (see exactly what a control sends), and Rescan. Built-in maps are read-only; Duplicate one to edit it.
Behaviors worth knowing
- Button modes: Momentary (normal), Latching (for toggle-type hardware that alternates note-on/off - fires on every edge), Hold (act while held) on holdable actions.
- Pickup (soft takeover) per absolute knob: the knob only takes over once it passes the current value - no value jumps after switching decks.
- Min/Max range per absolute knob, exactly like Live's MIDI mapping: percentages of the control's travel, Min above Max inverts. On "Tempo set" they are the BPM range.
- LED feedback is state-driven from the app: pads light for set cues and active loops, blink while a launch or quantized stop is pending, and go dark when a device is disabled.
- Load actions behave like drag-and-drop: loading onto a playing deck fires the new track at the boundary. The playing-deck guard from Settings applies to hardware exactly as to drags.
- Unload (eject) needs a double press within 3 seconds - same as the on-screen eject's two-tap confirm, so a stray pad hit cannot clear a live deck. The pad's LED blinks while the first press is waiting for the confirm.
- The header readouts are mappable too: BPM (whole and decimal parts separately), SNAP, DECKS, and REC.
- Up to 16 decks are available for mapping (use "More decks" in the Manager) even when fewer are displayed.
Map files
One file per controller, human-readable and shareable, in the midi-maps folder of the app's data folder (see Your data). Import/Export in the Manager moves single files - the easy way to share a mapping with a friend or move it to another computer. The built-in "Example - 2 deck starter" doubles as a starting point.
Settings reference
Settings opens as a sidebar on the right, running from just under the header to the status bar - the decks and library make room for it, and it stays open while you work (adjust the style and watch the decks respond live). The cog closes it again. Under the Settings title is a menu of sections - Global Settings, Mixer, Style, Updates, License, and Diagnostics. Click a section name to open it; opening one closes the others, and clicking the open name closes it again. Global Settings is open the first time; after that, the section you had open is remembered. How many decks are shown is set with the DECKS readout in the header (see The interface).
| Setting | Default | What it does |
|---|---|---|
| Do not load to a playing deck | off | Blocks any load (drag, right-click, MIDI, keyboard) aimed at a deck that is playing. |
| Load to the first cue point | on | A loaded track parks at its first hot cue. With it off (or no cues) it parks on the first bar of the beatgrid, so a quantized launch stays on the grid; unwarped tracks park at their beginning. |
| Warp in Complex Pro | on | Tracks the app warps (grid fixes, the drop's Warp + beatgrid choice) get Live's Complex Pro mode. Loops are never changed; the right-click "Warp in Complex Pro" action always applies. |
| Visually Repeat short loops | on | Tiles a looping clip across the whole lane instead of showing it once. |
| Show status bar | on | The bottom bar. Hiding it gives the waveforms the extra height. |
| Show hints in status bar | on | Grey hover hints. Errors and warnings always show. |
| Render quality | Auto | Auto adapts waveform sharpness and frame rate to your machine so scrolling stays smooth - on an older laptop it briefly softens the picture instead of stuttering. Full pins maximum sharpness. Balanced pins standard sharpness at the full frame rate - the best pick on battery, where maximum sharpness can micro-stutter while the graphics chip runs at reduced clocks. Reduced pins the lightest 30 fps mode (very weak hardware). The setting's description shows what is active right now. |
| Show performance overlay | off | A small readout in the top-right of the waveform area: frame rate and frame-time consistency (with a bar strip - green bars mean on-cadence frames), render cost, the active quality level, and Live tick timing. Turn it on when scrolling feels off; the same numbers ride the diagnostics report. |
| Live connection | - | Remote Script status and Install/Reinstall. Hidden once Live is connected. |
| Mixer: Deck knobs | 9 | Maximum macro knobs per deck strip (the layout and grip decide how many show). |
| Mixer: Master knobs | - | Assignable knobs on the master bar (master rack or return racks). |
| Mixer: Master bar below library | on | Master bar under the library panel; off places it between decks and library. |
| Mixer: Snapshots include master knobs | on | Knob snapshots also save and recall the master bar knobs (never volume, cue or crossfader). Off keeps snapshots strictly per-deck. |
| Mixer: Master clip warning | on | The whole master meter turns red while the level is past 0 dB. Off keeps only the top segments red. |
| Style + Edit | Rainbow | Waveform preset picker and the style editor. |
| License | Trial | Activate a license key, or Deactivate this computer (see License and trial). Shows your email and masked key when licensed. |
| Updates: Check for updates | on | Watch for a newer version and show an "Update Available" link in the status bar. Turn off to keep the app quiet about new versions - a Check now button appears instead, for checking by hand. |
| Updates: Status | - | Shows a Download link when a newer version is available (see Updates). |
| Diagnostics: Copy report / Save full log | - | Anonymized report for troubleshooting (see Troubleshooting). |
| Diagnostics: Clear analysis cache | - | Wipes computed waveforms; tracks re-analyze on next load. Cues and library are kept. |
| Diagnostics: Reset all settings | - | The last entry in Diagnostics. Restores style, layout, toggles, and window to defaults. Keeps your library, hot cues, and loops. |
License and trial
DJ Waveforms is a one-time purchase with a free trial. The trial is the complete app - every deck, the mixer, the library, MIDI and keyboard control, and all waveform styles. The only limit: after 15 minutes of continuous playback, playback pauses once. A small "playback pauses in 60 seconds" note appears a minute before, and the counter resets whenever every deck is stopped - so stopping between songs keeps it out of your way. Press play to carry on after a pause; nothing is lost.
Buying and activating
- Buy from the product page - the Purchase a license button in Settings > License. Your license key arrives by email and on the receipt.
- Open Settings > License, paste the key, and click Activate. The TRIAL badge in the status bar disappears within a second or two - no restart needed.
Moving between computers
A license activates on up to 3 computers. To move it, open Settings > License on a machine you no longer need and click Deactivate (that frees a slot), then Activate on the new machine. If you run out of slots - for example after reinstalling the operating system a few times - contact support to raise the limit or clear an old machine.
If you copy your license file to another computer, or simply rename your computer, the app keeps working and quietly re-checks itself the next time it is online. You are never dropped in the middle of a set over a licensing check.
Refunds
14-day, no-questions refunds. A refunded key is disabled and the app returns to the trial the next time it checks in with the license server - never mid-set.
Updates
Updates are free through version 1.x. With Check for updates on (the default), the app watches about once a day for a newer public release. When one is available, Settings > Updates shows the new version with a Download link, and an Update Available link appears in the status bar just left of the version - click either to open the download page. Install the new version over the old app; your hot cues, library, and settings are all kept. Turn Check for updates off to keep the app quiet about new versions - a Check now button appears in its place, so you can still check by hand when you choose; the result (and a Download link, if there is one) shows right there in the Status row without lighting up the status bar.
The app window
- Window: borderless by default, resizable, remembers size and position. The always-on-top pin in the header keeps it above Live (off by default; it survives most screen recorders).
- Resizing: with the library open, dragging the window's bottom edge resizes the library only - the decks keep their size (the divider above the master bar steps them S / M / L / XL). With the library hidden, the bottom edge steps the decks through those sizes and snaps to the one you see when you let go. Maximize fills the screen normally.
- Fullscreen: press F11 to toggle fullscreen on Windows and macOS (macOS also has the native green-button fullscreen). On Windows there is also a Fullscreen button in the header icon row.
- One instance: launching the app twice focuses the existing window. The app also cleans up after a previous crash on its own ("Closed a leftover server that was blocking the Live link").
- Quit: everything the app staged in Live is restored and the connection is released cleanly - Live keeps playing; only the app's view goes away.
- Unsigned Windows builds: Windows SmartScreen may ask you to confirm - choose "More info", then "Run anyway".
Your data and where it lives
All persistent data lives in one per-user folder, outside any cloud-synced directory:
| OS | Data folder |
|---|---|
| macOS | ~/Library/Application Support/DJWaveforms |
| Windows | %APPDATA%\DJWaveforms |
| File | Contents | Safe to delete? |
|---|---|---|
cues.json | Hot cues, names, colours, section fills - keyed by audio fingerprint | No - this is your performance data |
grids.json | Saved beatgrids per track (confirmed grids, proposals, undo history) - keyed by audio fingerprint | No - your grid work lives here |
library.json | Library edits and your custom track order | No - user data |
midi-maps/ | Your mapping files (including the editable keyboard map) | Only if you can re-map; keyboard defaults re-seed |
mixer.json, midi.json | Mixer knob mappings; MIDI device enables/assignments | Yes - remaps and enables are lost |
license.json | Your license key, activation, and machine binding | Yes - the app returns to the trial and you re-enter your key |
window.json, cuemode.json | Window bounds; last detected Solo/Cue mode | Yes - recreated |
analysis/ | Waveform analysis cache (bounded, self-pruning) | Yes - same as "Clear analysis cache" |
server.log, diagnostics.log, diag-*.json, server.lock | Logs, diagnostics history, housekeeping | Yes |
Every data file keeps a .bak last-good sibling and is written crash-safe, so a crash mid-write cannot corrupt it.
cues.json and library.json. "Reset all settings" never touches them.Troubleshooting
"Waiting for Live" never connects
- Is Live running with a set open?
- Is AbletonJS set as a Control Surface in Live > Preferences > Link/Tempo/MIDI? (Settings > Live connection shows whether the script is installed; the status pill reads "no signal" while Live is missing.)
- Did you restart Live after installing/enabling the script?
- If the script was installed but Live still never appears: your Ableton User Library may be in a custom location, so the script was copied where Live never looks. Copy the
AbletonJSfolder into your actualUser Library/Remote Scripts(see First run).
"No signal" while Live is clearly running
- The app heals most connection problems on launch by itself ("Closed a leftover server that was blocking the Live link") - quitting and relaunching the app is the reliable fix.
- On Windows, if reconnecting after a relaunch takes 15-30 s, the app will offer the bridge-script update; restart Live once after it installs.
A deck arms (fill rises) but never starts
The Live track is deactivated - Live ignores launches on deactivated tracks. Re-enable the track in Live (the app shows a warning naming the deck).
Clips launch then instantly stop (some tracks, not others)
This is almost always a stray MIDI mapping saved inside that Live set, not the app or the file. A track control mapped to "fire scene" or "stop" gets triggered by MIDI arriving on a virtual/loopback port (commonly the macOS IAC Driver) with Live's Remote switch left on - so the clip starts and is stopped again a beat later. Tracks without such a mapping play fine, which is the tell. Fix it in Live: Preferences > Link/Tempo/MIDI, turn Remote off for ports you are not deliberately mapping; then clear the set's mappings with Cmd+M (select the affected track, delete its entries) and save. DJ Waveforms never needs Live's Remote (see First run).
Loading a track is slow the first time
First load of a file decodes and analyzes the audio (a second or two for long lossless files); results are cached, so every later load is instant. Use the library's Analyze button to pre-cache the whole set (and check every beatgrid) before a gig. Analysis runs in the background and never interrupts playing decks.
The waveform looks wrong / out of date
- Settings > Clear analysis cache, then reload the track.
- MP3 grid alignment (waveform shifted ~50 ms against the beat grid) is corrected automatically for standard encoders; if you see it, clear the cache once - and if it persists, send a diagnostics report.
Waveforms look soft/blurry after moving the window to another display
Displays with different pixel densities can leave the picture at the old scale. Resize the window slightly (or quit and relaunch the app) after moving between displays.
Waveforms look softer than usual, or scrolling stutters
Render quality is set to Auto by default: on a machine that cannot keep scrolling smooth (older laptops, no GPU acceleration, battery saver) it reduces waveform sharpness and, if needed, frame rate instead of stuttering - and steps back up when there is headroom. Settings > Render quality shows what is active right now; pick Full to force maximum sharpness. If scrolling still stutters on Full, your machine cannot keep up at that quality - switch back to Auto. On a laptop running on battery, try Balanced: power saving lowers the graphics clocks, and maximum sharpness can then micro-stutter even though the frame rate looks fine. Turn on Settings > Show performance overlay to watch the live frame timing while you test: steady green bars mean frames are on cadence (the wobble is elsewhere), amber/red bars mean dropped frames. The diagnostics report (Settings > Diagnostics > Copy report) includes the same measurements and whether your system is rendering without GPU acceleration.
After laptop sleep the decks look stale
Quit and relaunch the app to resync with Live.
Keyboard shortcuts do nothing
- A text field has focus (typing is always safe) - click empty space first.
- The mapping Manager is open - close it.
- The Keyboard device is disabled - Mapping > Manager > enable "Keyboard shortcuts".
MIDI controller not responding
- Open Mapping > Manager: is the device listed and enabled, with a mapping assigned? Use Rescan after plugging in.
- Watch the Monitor while moving a control - if events appear, the binding is the issue (re-learn it); if nothing appears, the connection is (check the cable, close other MIDI software holding the port).
- Two identical controllers exposing the same port name cannot be driven independently (one works fine).
Headphone cue buttons are missing
Live's mixer is in Solo mode. Switch Live to Cue mode (the Solo/Cue toggle by the master track) and the buttons return.
Sending a useful bug report
- Settings > Diagnostics > Copy report - a short, anonymized summary of the session (connection handshake, startup timeline, analysis timing). Paste it into your report.
- For deeper issues, Save full log attaches the complete diagnostics log (also anonymized). Both are always on - nothing to enable, nothing to reproduce twice.