Skip to content

Mixer & EQ

Channel Strip

Each deck has an independent channel strip with this signal flow:

Source → Trim → EQ → Color FX → Effects → Fader → Analyser → Crossfader Gain → Master

                              CUE Gain → Headphone Bus (pre-fader)

Layout

The mixer is a 3-column CSS grid: Deck A (left), center icons, Deck B (right). From top to bottom:

SectionControlRange
Gain trimKnob (bipolar)-12 to +12 dB
HI EQKnob + Kill button±range (configurable)
MID EQKnob + Kill button±range
LOW EQKnob + Kill button±range
Color FXKnob (bipolar)-1 to +1
VolumeVertical fader (140px)0 to 1
VU Meter12-segment LED columnPer-deck

Deck A controls read left-to-right (value → knob → kill), Deck B is mirrored (kill → knob → value).

EQ Models

Three models selectable in Settings, hot-swappable at runtime. See Architecture for exact crossover frequencies.

LR4 Isolator (Default)

Linkwitz-Riley 24 dB/oct parallel isolator. Crossovers at 250 Hz and 4000 Hz. Each band is fully independent — killing one band has zero effect on the others.

DJ Peak (Pioneer DJM-style)

Serial shelving/peaking EQ at 80 Hz / 1 kHz / 12 kHz. No kill capability — this model trades isolation for a smoother, more musical response.

Xone Kill (Allen & Heath-style)

48 dB/oct full-kill isolator. Crossovers at 200 Hz and 2500 Hz. Slight resonance (Q=1.0) at crossover points gives a characteristic bump.

Kill Switches

On isolator models (LR4, Xone), when the EQ knob reaches the minimum of its range, the band gain snaps to 0 (true silence). This is a hard kill, not a fade — the transition is instant.

Color FX

Bipolar filter sweep from -1 to +1:

  • Negative: Lowpass — sweeps from 20 kHz down to 20 Hz
  • Zero: Bypass (20 kHz, fully open)
  • Positive: Highpass — sweeps from 20 Hz up to 20 kHz

Frequency follows an exponential curve: 20 × 1000^|knob|. Q increases toward the extremes for more aggressive filtering.

Volume Fader

140px vertical fader, range 0 to 1. The volume LCD below shows dB: values below -60 dB display as "-∞".

VU Meters

Per-Deck Meters

PropertyValue
MeasurementRMS (√mean of squares × 1.414 scaling)
Segments12
Width6px per column
ColorsSegments 0–7: green, 8–9: amber, 10–11: red
AttackInstant (0 ms)
ReleaseLogarithmic decay, factor 0.88/frame (~150 ms to half)
Peak hold1000 ms, then decays
Update rate~30 fps (direct DOM, no React re-renders)

The 1.414× scaling (√2) ensures a full-scale sine wave reads ~1.0 on the meter.

Master VU Meter

Center column, 2 columns (L/R) × 12 segments × 5px width. Same color scheme as deck meters but with 0.3 off-opacity (vs 0.5 for decks). No ballistics — raw level applied directly.

Known Issue

Both L and R columns read the same levels.master value — true stereo metering is not implemented on the master bus.

Crossfader

Horizontal fader (260px), labeled A (left) and B (right). Position 0 = full Deck A, position 1 = full Deck B.

Curves

CurveFormulaCharacter
Smooth (default)cos(pos × π/2) / sin(pos × π/2)Equal-power, no center dip
SharpCubic (1-x)³ / over 0.02–0.98, with 2% dead zonesBoth full at center, fast cuts

Headphone Cue

Pre-fader listen (PFL) — taps signal after effects but before the volume fader.

Controls

ControlFunction
CUE A / CUE BToggle pre-fader listen per deck
Mix knobBlend CUE ↔ Master (equal-power cosine crossfade)
VolumeHeadphone output level
SplitL = CUE, R = Master (mono sum each side)

Split mode crossfades over 10 ms to prevent clicks when toggling.

Phase Meter

Located in the mixer HUD (tabbed with SCOPE). Shows beat phase alignment between decks:

ZoneDeltaColorVisual
LOCKED< 2 msWhiteNo label
NEAR2–10 msGreen"+5ms"
WARN10–30 msAmber"-15ms"
CRIT> 30 msRedShake animation

HP / Master EQ Strip

Toggle between two panels below the crossfader:

HP Panel: CUE A button, Mix knob, Split toggle, Volume knob, CUE B button

Master EQ Panel: Low (80 Hz) / Mid (1 kHz) / High (12 kHz) shelf knobs, ±12 dB

Effects

Architecture

Effects are parallel sends off a shared filter merge bus, not serial. Each effect has an independent wet gain summed into a gate node before output.

Input → Filter (inline LP/HP) → Filter Merge
    ├── Dry (gain-compensated) ──────────────┐
    ├── Delay send ──────────────────────────┤
    ├── Reverb send ─────────────────────────┤
    ├── Phaser send ─────────────────────────┤
    ├── Flanger send ────────────────────────┤
    ├── Crusher send ────────────────────────┼→ Gate → Output
    ├── Echo send ───────────────────────────┤
    ├── Tape send ───────────────────────────┤
    └── Noise (independent source) ──────────┘

Gain Compensation

Dry gain is dynamically adjusted based on active wet sends:

dryLevel = 1.0 / (1.0 + sumOfAllWetGains)

This prevents volume stacking when multiple effects are active simultaneously.

Parameter Smoothing

All AudioParam changes use setTargetAtTime() with τ = 12 ms. Changes smaller than 1×10⁻⁶ are skipped.

Effect Reference

FLT — Bipolar Filter (Inline)

ParameterRangeNotes
Amount0–1 (mapped to -1..+1)Negative = LP, Positive = HP
Frequency20 Hz – 20 kHz`20 × 1000^
Q1 (default), max 4Tapered toward extremes

Not a send — processes inline before all other effects.

DLY — Tempo Delay

ParameterRangeNotes
Wet0 – 0.6amount × 0.6
Feedback0.3 – 0.650.3 + amount × 0.35
TimeBPM-syncedDotted 8th: (60/BPM) × 0.75

REV — Reverb

ParameterRangeNotes
Wet0 – 0.5amount × 0.5
IR duration1.2sSynthetic noise decay (x³ envelope)
IRSharedSingle buffer across all decks (saves 211 KB)

PHA — 4-Stage Phaser

ParameterRangeNotes
Wet0 – 0.7amount × 0.7
LFO rate0.2 – 2.2 Hz0.2 + amount × 2
LFO depth400 – 1600 Hz400 + amount × 1200
Stages4Allpass chain, Q=5

FLG — Flanger

ParameterRangeNotes
Wet0 – 0.6amount × 0.6
LFO rate0.1 – 1.6 Hz0.1 + amount × 1.5
LFO depth1 – 5 ms0.001 + amount × 0.004
Feedback0.3 – 0.6Capped to prevent resonance > 0 dB
Base delay5 msReset to 3 ms on activation

GATE — Beat-Locked Chop

ParameterValuesNotes
Divisions1/32, 1/16, 1/8, 1/4, 1/2Amount selects index 0–4
Duty cycle70% open / 30% closedFixed
Ramp2 ms attack, 5 ms releasePrevents clicks
BPM syncYesLocked to beat grid

CRU — Bitcrusher

ParameterRangeNotes
Wet0 – 0.7amount × 0.7
Steps16 (mild) → 3 (harsh)16 - amount × 13
Curve4096-sample staircaseRegenerated only when step count changes

ECH — Dub Echo

ParameterRangeNotes
Wet0 – 0.5amount × 0.5
TimeBPM-syncedHalf beat: (60/BPM) × 0.5
Feedback0.4 – 0.7Capped from 0.85 to prevent low-freq buildup
Filter3000 → 800 Hz LPIn feedback loop — progressive darkening
Filter Q0.5Fixed

TAPE — Tape Stop

Stub Effect

TAPE is a non-functional stub. The implementation is a single GainNode with wet gain up to 0.4 — no filter, no pitch manipulation, no playback rate change. It simply mixes a gained copy of the dry signal, causing a slight volume boost rather than a tape stop effect.

NOISE — White Noise Sweep

ParameterRangeNotes
Wet0 – 0.35amount × 0.35
Filter200 – 12000 Hz LP200 + amount × 11800
Filter Q1 – 4Capped at 4 to prevent violent transients
SourceIndependent2s looping noise buffer (shared, saves 352 KB)

Not sourced from audio input — generates its own white noise.

Recording

Format

PropertyValue
FormatWAV (32-bit float PCM, stereo)
Sample rateMatches AudioContext (44,100 Hz)
Tap pointPost-limiter master bus output

Architecture

Crash-proof design using SharedArrayBuffer ring buffer (131,072 frames, ~3 seconds at 44.1 kHz). Audio flows: MasterBus.output → recording-tap AudioWorklet → SharedArrayBuffer → Electron IPC → fs.writeSync.

Fixed ~1 MB RAM regardless of recording length.

Features

  • Start/stop/cancel recording
  • Save As via native dialog
  • Orphan recovery (temp files from crashes survive on disk)

Electron Only

Recording requires the Electron desktop app with SharedArrayBuffer support. Not available in browser-only mode.