Signal Flow

Understanding how audio flows through TabDSP's processing chain and why module order matters.

The Signal Chain

TabDSP Signal Chain Pre-EQ spectrum · 512 bins IN meters · L/R peak + RMS Post-EQ spectrum · 512 bins Post-dynamics spectrum · 512 bins LUFS meter · BS.1770-4 OUT meters · L/R peak + RMS Bypass path INPUT Fixed Input gain · Level meter · DC removal · Pre-EQ spectrum tap Graphic EQ module EQ Draggable Saturation · HP/LP filters · Bell bands · Analog color · Linear-phase · M/S Multiband Compressor module Multiband Compressor Draggable LR4 crossovers · Per-band RMS compression · Band sum · Post-dynamics tap Compressor module Compressor Draggable Sidechain HP · RMS envelope · Gain reduction · Makeup gain True Peak Limiter module Limiter Fixed Lookahead buffer · True-peak detection · Brickwall limiting OUTPUT Fixed Output meter · Master gain · Routed to browser

Default Order: INPUT → EQ → Multiband → Compressor → Limiter → OUTPUT

Analysis Taps

These taps read the signal at different points in the chain for display only — they run in parallel and don't affect the audio.

  • Pre-EQ spectrum tap — FFT, 512 log-spaced bins, feeds the spectrum analyzer
  • Post-EQ spectrum tap — same, shows the shaped signal after EQ
  • Post-dynamics spectrum tap — same, after the last dynamics module (purple overlay)
  • LUFS meter — ITU-R BS.1770-4 loudness measurement, parallel tap from output

Stereo Metering Taps

  • Input stereo meters — FFT 256, L/R peak and RMS after input gain
  • Output stereo meters — FFT 256, L/R peak and RMS after the limiter
  • Read at ~30 fps, 256 samples per channel

Fixed vs. Draggable Modules

Fixed Modules (Always Same Position)

  • INPUT: Must be first - normalizes incoming audio, removes DC offset, provides analysis taps
  • LIMITER: Must be after dynamics - catches peaks from compression makeup gain, prevents clipping
  • OUTPUT: Must be last - final gain control, LUFS measurement before destination

Draggable Modules (Reorderable)

  • EQ: Frequency shaping with Linear Phase or M/S modes
  • MULTIBAND: Frequency-dependent dynamics (3 or 4 bands)
  • COMP: Full-band compression with sidechain filtering

How to reorder: Click and drag a module block's drag handle (three horizontal lines). Drop between connectors to change position. Module order is saved in presets and site overrides.

Why Order Matters

Different module orders create fundamentally different sounds. Here's why:

EQ Before Compression

Order: INPUT → EQ → COMP → LIMIT → OUTPUT

  • What happens: You shape the frequency balance, THEN compress the shaped audio
  • Result: Compressor reacts to post-EQ signal. Boosted frequencies trigger more compression.
  • Use for: Corrective listening — fix frequency issues before leveling dynamics
  • Example: Cut muddy 200Hz, then compress. Compressor won't pump from bass anymore.

Compression Before EQ

Order: INPUT → COMP → EQ → LIMIT → OUTPUT

  • What happens: You level dynamics first, THEN shape tone
  • Result: EQ doesn't affect compressor behavior. Cleaner separation of dynamics and tone.
  • Use for: When you want compression to be frequency-agnostic
  • Example: Compress evenly, then boost presence at 3kHz without changing compression behavior.

Multiband First

Order: INPUT → MB → EQ → COMP → LIMIT → OUTPUT

  • What happens: Frequency-dependent dynamics control, then tonal shaping, then final glue
  • Result: Multiband tames problem frequencies, EQ shapes overall tone, compressor glues it together
  • Use for: Taming problem frequencies before shaping tone
  • Example: De-ess with multiband (5-8kHz), EQ for warmth, final compression for consistency.
Order Best For Character
EQ → MB → COMP Corrective listening Surgical, controlled, professional
COMP → EQ → MB Clean separation Dynamics are frequency-neutral; EQ shapes tone post-leveling
MB → EQ → COMP Frequency control first Aggressive control, broadcast-ready
EQ → COMP → MB Vocal-focused content Natural tone shaping with controlled dynamics

Drag-and-Drop Reordering

How It Works

  1. Click and hold the drag handle (three horizontal lines) on any draggable module
  2. Drag the module left or right
  3. Visual feedback:
    • Dragged module becomes semi-transparent
    • Valid drop zones (connectors) highlight in green
    • Invalid drop zones (adjacent to current position) dim
    • Other modules shift to make room
  4. Drop on a connector to reorder
  5. Audio crossfades to new order (50ms, glitch-free)

Bypass Arcs

When a module is bypassed, an orange arc appears showing signal routing around it:

  • Single bypass: U-shaped arc over one module
  • Consecutive bypasses: Arc spans all bypassed modules in sequence
  • Signal flows through bypass path, module processing is skipped (saves CPU)
▶ Gear Head Details: Modular Routing Architecture

TabDSP uses a module wrapper pattern for dynamic routing.

How modules stay isolated: Each module presents a single input and a single output, and internally carries two parallel paths between them — one that runs the audio through its processing and one that carries the same audio dry. Bypass is simply a crossfade between those two internal paths, which is why engaging or disengaging a module is click-free even under heavy processing. Modules connect edge-to-edge without peeking inside each other, so reordering or toggling one never alters what another module hears at its input.

How reordering happens without artifacts: When you drag a module to a new slot, the entire chain briefly crossfades down to a clean pass-through, the connections between modules are rewired in the new order, and the chain crossfades back up. The crossfade runs around 50 ms — long enough to suppress the discontinuity of rewiring, short enough that the transition feels instant to the ear.

What reordering actually does: When the new module order is committed, the chain is reassembled by walking the ordered list of draggable modules from the input tap outward, connecting each module's output to the next module's input in sequence. The final draggable module feeds the limiter, which sits in a fixed position at the end of the signal path regardless of how the draggable modules are arranged. This keeps the limiter as a guaranteed last line of defense on the master output while the rest of the chain stays freely reorderable.

Analysis Tap Points

TabDSP has multiple analysis taps that measure audio at different points in the signal chain. These run in parallel and don't affect the audio signal.

Tap Point Type What It Measures Used For
Input mono tap FFT (4096) Raw input after input gain Input meter display
Pre-EQ spectrum tap FFT (8192) After DC removal, before EQ Blue spectrum (pre-EQ, 512 log bins)
Post-EQ spectrum tap FFT (8192) After EQ, before dynamics Orange spectrum (post-EQ, 512 log bins)
Post-dynamics spectrum tap FFT (8192) After the last dynamics module in the current order Purple spectrum overlay (512 log bins)
Output mono tap FFT (4096) After all processing Output meter
Input stereo meters (L / R) FFT (256) After input gain (parallel dead-end via channel splitter) Independent L/R input peak/RMS metering
Output stereo meters (L / R) FFT (256) After the limiter (parallel dead-end via channel splitter) Independent L/R output peak/RMS metering
LUFS meter ITU-R BS.1770-4 Parallel tap from the output (not in signal path) LUFS loudness measurement (LUFS Stack)
Purple Overlay Details

The purple spectrum (post-dynamics tap) reads the output of whichever dynamics module — Multiband or single-band Compressor — is last in the current module order. It reconnects automatically when modules are reordered via drag-and-drop. This shows the cumulative effect of all dynamics processing on the frequency spectrum.

State Persistence

Module order and bypass states are saved in:

  • Global settings: Applies to all websites by default
  • Site overrides: Per-website settings (enable "Site Override" toggle)
  • Presets: Saved in custom and factory presets
  • A/B comparison: Module order switches when toggling A/B

State format:

{
  moduleOrder: ['eq', 'multiband', 'singleComp'],
  moduleBypass: {
    eq: false,
    multiband: true,   // Bypassed
    singleComp: false
  }
}