CoProducer Measure a mix
A glowing magenta 808 pulse beside cyan hi-hat transients ducking toward a black bus compressor with a magenta gain-reduction needle

Dynamics · 7 October 2026 · 8 min

Your bus compressor is pumping on the 808. High-pass the sidechain

NoDAW Labs · Lacquer Vol. 04

If your hats, cymbals, and vocal air duck every time the 808 or kick hits, the low end is driving your mix bus compressor. A high-pass filter on the compressor’s sidechain (detector), usually around 60–150 Hz, keeps the glue without letting the bass turn the whole mix down.

You put a bus compressor on the mix for glue. A couple dB of gain reduction, nice and musical. Then the hook comes in, the 808 sustains through the bar, and the hats start breathing. The ad-libs get softer on every long bass note. It sounds a little like sidechain pumping in a house record, except you never asked for it.

That’s because the compressor only sees one thing: level. And in a modern hip-hop, trap, R&B, or EDM mix, most of the level is under 100 Hz. When an 808 that’s holding a long note sits 6–10 dB above everything else, the detector hears “loud” and turns the whole mix down, top end included. When the 808 lets go, everything swells back up. That’s the pump.

What the sidechain filter actually does

A sidechain high-pass (SC HPF, sometimes called the detector filter) doesn’t touch the audio you hear. It only changes what the compressor listens to when it decides how hard to work. Filter the low end out of the detector and the compressor reacts to the snare, the vocal, and the overall energy of the record, not to every long 808 note. The 808 still goes through at full weight.

Most good bus compressors have this built in. On SSL-style units it might be a switch at 60 or 90 Hz. Many plugins give you a continuous knob. If yours doesn’t, an external sidechain fed from a high-passed copy of the mix does the same job.

Measure the pump instead of arguing about it

Pumping is easy to talk yourself in or out of after the tenth listen. So this script compares a section bounced before and after the compressor and measures how much the top end (above 5 kHz) gets ducked in 20 ms windows, split by whether the low end is big or quiet at that moment. If the top end ducks a lot more when the 808 is big, the 808 is running your compressor.

#!/usr/bin/env python3
"""pump_check.py: is your bus compressor ducking the hats every time the 808 hits?
Usage: python3 pump_check.py before.wav after.wav
  before.wav = mix bus BEFORE the compressor (or the bypassed bounce)
  after.wav  = same section WITH the compressor, same length, same start
Needs: numpy + ffmpeg on PATH.

Measures how much the top end (above 5 kHz) gets turned down in 20 ms
windows, and how much that ducking swings. Big swing that tracks the
low end = audible pumping on hats, cymbals, and vocal air."""
import subprocess, sys
import numpy as np

SR, WIN = 48000, 0.020

def band(path, af):
    raw = subprocess.run(["ffmpeg", "-v", "error", "-i", path, "-ac", "1", "-ar", str(SR),
                          "-af", af, "-f", "f32le", "-"], capture_output=True, check=True).stdout
    return np.frombuffer(raw, dtype=np.float32)

def rms_db(x):
    w = int(WIN * SR)
    n = len(x) // w
    r = np.sqrt(np.mean(x[: n * w].reshape(n, w) ** 2, axis=1))
    return 20 * np.log10(r + 1e-9)

hi = "highpass=f=5000:poles=2,highpass=f=5000:poles=2"
lo = "lowpass=f=120:poles=2,lowpass=f=120:poles=2"
pre_hi, post_hi = rms_db(band(sys.argv[1], hi)), rms_db(band(sys.argv[2], hi))
pre_lo = rms_db(band(sys.argv[1], lo))
n = min(len(pre_hi), len(post_hi), len(pre_lo))
pre_hi, post_hi, pre_lo = pre_hi[:n], post_hi[:n], pre_lo[:n]

live = pre_hi > pre_hi.max() - 30          # only windows where the top end is actually playing
duck = (post_hi - pre_hi)[live]
low_when = pre_lo[live]
loud_low = low_when > np.percentile(low_when, 75)
quiet_low = low_when < np.percentile(low_when, 25)

print(f"top-end windows      : {live.sum()} of {n} (20 ms each)")
print(f"avg top-end change   : {duck.mean():+.2f} dB")
print(f"worst top-end dip    : {duck.min():+.2f} dB")
print(f"ducking swing (p5-95): {np.percentile(duck, 95) - np.percentile(duck, 5):.2f} dB")
print(f"while low end is big : {duck[loud_low].mean():+.2f} dB")
print(f"while low end is low : {duck[quiet_low].mean():+.2f} dB")
gap = duck[quiet_low].mean() - duck[loud_low].mean()
print(f"808-linked ducking   : {gap:.2f} dB")
print("verdict              : " + ("the low end is driving the compressor. Try a sidechain high-pass."
                                    if gap > 1.0 else "top end isn't tracking the low end. No obvious pump."))

What it found on a test loop

Synthetic again, built on the box and labeled that way: a 140 BPM trap-style loop with a kick, a long 49 Hz 808, a snare, and eighth-note hats. We ran it through the same compressor settings (4:1, 5 ms attack, 120 ms release, same threshold) and changed only the sidechain filter.

DetectorAvg top-end changeDucking swingExtra ducking when the 808 is big
Full-band (no filter)−3.9 dB7.0 dB3.8 dB
SC HPF 60 Hz−2.3 dB5.4 dB1.4 dB
SC HPF 100 Hz−2.0 dB4.8 dB0.8 dB
SC HPF 150 Hz−1.9 dB4.4 dB0.5 dB

With a full-band detector, the hats were turned down almost 6 dB while the 808 was big and about 2 dB while it was quiet. That nearly 4 dB gap is the breathing you hear. A 100 Hz sidechain filter cut the gap to under 1 dB. The compressor was still doing a couple dB of steady glue, which is the part you actually wanted.

Notice the steps get smaller after 100 Hz. Past a certain point you aren’t fixing the pump anymore, you’re just making the compressor ignore more of the record. That’s why 60–150 Hz is the useful range and not 300.

Picking the frequency by genre

RecordStart hereWhy
Trap, drill, 808-heavy hip-hop100–150 HzLong 808 notes carry most of the energy. Let the snare and vocal drive the glue.
R&B, pop60–100 HzYou still want the bass to nudge the compressor a little so the groove feels connected.
House, techno60–90 Hz, or offSome pump is the genre. Decide on purpose instead of by accident.
Rock, live bands60–90 HzKick and bass guitar trigger it less than an 808, but toms and low guitars can still drag it.

Fix order

  1. Turn on the sidechain filter first, before you touch attack, release, or threshold. It changes how everything else behaves.
  2. Re-set the threshold. With the low end removed from the detector, the compressor sees less level and will do less. Bring the threshold down until you’re back to your 1–3 dB of glue.
  3. Then shape release to the tempo. At 140 BPM an eighth note is about 214 ms. A release that recovers well within that keeps the hats from sitting in a hole.
  4. If the 808 still bullies everything, it may be a balance problem, not a compressor problem. Your kick and 808 are arguing in the same chair covers that side.

A quick way to check a bounce you didn’t mix: split it with StemSplit, listen to the “other” and vocal stems on their own, and see if they breathe in time with the bass. If they do, the pump is printed in, and that’s a recall-the-session conversation. If you can get a fixed bounce, CoProducer’s A/B is a quick way to hear the pumping version and the fixed one back to back.

Why do my hi-hats duck when the 808 plays?
The mix bus compressor is reacting to the 808’s low-end energy and turning the whole mix down. A high-pass on the compressor’s sidechain, around 60–150 Hz, stops the bass from triggering it.
Does a sidechain high-pass remove bass from my mix?
No. It only filters what the compressor listens to. The audio you hear keeps its full low end.
What sidechain HPF frequency should I use?
Start around 100 Hz for 808-heavy records and 60–90 Hz for pop, R&B, and live bands. Then set the threshold again, because the compressor will be doing less.

A free one-pager

The checklist we run before every release.

Loudness, true peak, mono, tails, export settings and the metadata basics, on one page. Leave your email and it opens straight away, or read it here first. No email needed for that.