CoProducer Measure a mix
Several upright panes of glass glowing amber on gold-veined black marble, a thick amber haze piling up where they overlap, with one clear cyan-edged pane in front, studio screens out of focus behind.

Mixing · 10 November 2026 · 6 min

Mix sounds muddy? It’s the low-mid pile-up, not one bad track

NoDAW Labs · Lacquer Vol. 06

A mix usually sounds muddy because several tracks each put a little energy between 200 and 500 Hz, and it adds up, not because one track is wrong. In our test the low mids on the bus came out 4.9 dB louder than on any single track. A cut on the master bus lowered the mud but took the vocal down with it. Small cuts on the keys and guitar, the parts that didn’t need that band, gave the vocal 2.5 dB more room without touching it.

You solo the keys and they sound great. The guitar sample, great. The vocal, warm. Then you play everything together and the middle turns into soup. Nothing is clearly too loud, the words are a little harder to follow, and the whole thing sounds like it’s behind a blanket.

So you reach for the master bus EQ, scoop some low mids, and it gets cleaner and smaller at the same time. That’s the clue. The mud isn’t in one place, so a fix in one place can’t really get it out.

Why nothing sounds muddy on its own

The low mids are where most instruments keep their body. Chords played in the middle of a keyboard, a guitar’s lower strings, a snare’s shell, the bottom of a voice. Each part on its own needs some of that band to sound full. Stack five of them in the same key and they’re all sitting on the same few notes.

We wrote mud_check.py to put numbers on that. It builds a small arrangement out of plain harmonic tones: an 808 on G1, a keys pad on a C chord, a guitar-style sample on a G chord, a snare body and a three-note vocal line. Then it measures how much of each track lands between 200 and 500 Hz, on its own and summed, and tries a few EQ moves, each a 300 Hz bell with a Q of 1.

#!/usr/bin/env python3
"""Where low-mid mud comes from: five synthetic tracks, the 200-500 Hz band, and two ways to cut it.
Every track is a plain harmonic tone (no real audio). Needs numpy + scipy."""
import numpy as np
from scipy.signal import lfilter
SR, DUR = 48000, 4.0
t = np.arange(int(SR * DUR)) / SR
hz = lambda m: 440 * 2 ** ((m - 69) / 12)            # MIDI note -> Hz

def tone(notes, n_harm, tilt, gain_db):
    """Sum of harmonic tones; harmonic k at 1/k**tilt. Normalised to the same RMS, then gain_db."""
    x = sum(sum(np.sin(2 * np.pi * hz(m) * k * t) / k ** tilt for k in range(1, n_harm + 1)
                if hz(m) * k < SR / 2) for m in notes)
    return x / np.sqrt(np.mean(x ** 2)) * 10 ** (gain_db / 20)

def bell(x, f0, gain_db, q=1.0):                     # RBJ peaking EQ
    A, w = 10 ** (gain_db / 40), 2 * np.pi * f0 / SR
    al = np.sin(w) / (2 * q)
    b = [1 + al * A, -2 * np.cos(w), 1 - al * A]; a = [1 + al / A, -2 * np.cos(w), 1 - al / A]
    return lfilter(np.array(b) / a[0], np.array(a) / a[0], x)

def band_db(x, lo=200, hi=500):
    X = np.abs(np.fft.rfft(x)) ** 2; f = np.fft.rfftfreq(len(x), 1 / SR)
    return 10 * np.log10(X[(f >= lo) & (f < hi)].sum() / X.sum() * np.mean(x ** 2) + 1e-20)

tracks = {                                           # (notes, harmonics, tilt, level dB)
    "808":    tone([31], 12, 1.6, -6),                # G1 with some saturation harmonics
    "keys":   tone([48, 52, 55, 60], 10, 1.2, -12),   # C3 E3 G3 C4 pad
    "guitar": tone([50, 55, 59, 62], 8, 1.0, -14),    # D3 G3 B3 D4 sample
    "snare":  tone([50], 20, 0.7, -16),               # body near 147 Hz plus overtones
    "vocal":  tone([55, 57, 59], 14, 0.9, -10),       # G3 A3 B3 lead
}
print("Low-mid band = 200-500 Hz. Level of each track's energy in that band:")
for n, x in tracks.items(): print(f"  {n:7s} {band_db(x):6.1f} dB")
bus = sum(tracks.values()); loudest = max(band_db(x) for x in tracks.values())
print(f"  bus     {band_db(bus):6.1f} dB  ({band_db(bus) - loudest:+.1f} dB over the loudest single track)")

def rest(tr, skip="vocal"): return sum(x for n, x in tr.items() if n != skip)
def report(name, tr):
    b = sum(tr.values())
    vr = band_db(tr["vocal"]) - band_db(rest(tr)) - V0
    print(f"  {name:32s} bus {band_db(b) - band_db(bus):+5.1f} dB | vocal {band_db(tr['vocal']) - band_db(tracks['vocal']):+5.1f} dB | vocal vs rest {vr:+5.1f} dB")
V0 = band_db(tracks["vocal"]) - band_db(rest(tracks))
print(f"  vocal vs everything else in the band: {V0:+.1f} dB")
print("\nMoves (bell at 300 Hz, Q 1). Changes in the 200-500 Hz band vs doing nothing:")
report("-4 dB on the master bus", {n: bell(x, 300, -4) for n, x in tracks.items()})
report("-4 dB on keys + guitar only", {n: (bell(x, 300, -4) if n in ("keys", "guitar") else x) for n, x in tracks.items()})
report("-4 dB on keys + guitar + snare", {n: (bell(x, 300, -4) if n in ("keys", "guitar", "snare") else x) for n, x in tracks.items()})
report("-8 dB on keys only", {n: (bell(x, 300, -8) if n == "keys" else x) for n, x in tracks.items()})
$ python3 mud_check.py
Low-mid band = 200-500 Hz. Level of each track's energy in that band:
  808      -25.3 dB
  keys     -16.1 dB
  guitar   -16.9 dB
  snare    -22.0 dB
  vocal    -12.6 dB
  bus       -7.7 dB  (+4.9 dB over the loudest single track)
  vocal vs everything else in the band: -1.5 dB

Moves (bell at 300 Hz, Q 1). Changes in the 200-500 Hz band vs doing nothing:
  -4 dB on the master bus          bus  -3.2 dB | vocal  -2.9 dB | vocal vs rest  +0.6 dB
  -4 dB on keys + guitar only      bus  -1.3 dB | vocal  +0.0 dB | vocal vs rest  +2.5 dB
  -4 dB on keys + guitar + snare   bus  -1.6 dB | vocal  +0.0 dB | vocal vs rest  +3.3 dB
  -8 dB on keys only               bus  -0.7 dB | vocal  +0.0 dB | vocal vs rest  +1.5 dB

Reading the numbers

The bus is louder in the low mids than any track. The vocal has the most energy in the band of any single part, −12.6 dB. The bus has −7.7 dB, 4.9 dB more. That’s the pile-up. And even before any EQ, the vocal is 1.5 dB under everything else in that band. It isn’t buried because it’s quiet. It’s buried because four other parts are standing in the same spot.

The master bus cut lowers the mud and the vocal together. Four dB off at 300 Hz on the bus took the band down 3.2 dB, the biggest drop on the list. It also took the vocal down 2.9 dB, so the vocal only gained 0.6 dB against the rest. Cleaner, smaller, and the words are still fighting.

Cutting the parts that don’t need the band clears room. The same 4 dB cut on just the keys and guitar only lowered the bus by 1.3 dB, but the vocal didn’t move at all and gained 2.5 dB against the rest. Add the snare and it’s 3.3 dB. Less mud removed, more clarity. That’s the trade you want.

Several small cuts beat one big one. An 8 dB cut on the keys alone gave the vocal 1.5 dB. Two 4 dB cuts on keys and guitar gave it 2.5. A big scoop on one part also tends to make that part sound hollow when you solo it, so spreading it out is kinder to everything.

These are synthetic tones in one key, not a real session, and real instruments move around more than this. Read it for the shape: mud is a sum, and you clear it by deciding who gets the band, not by turning the band down for everybody.

How to clear it in your session

  1. Decide who owns the low mids in each section. Usually the vocal in a verse, maybe the keys in an intro. One or two parts, not five.
  2. Cut the others a few dB, not a lot. A wide bell somewhere in the low mids on each part that isn’t the owner. Sweep it with the full mix playing and stop where the vocal steps forward, not where the soloed track sounds best.
  3. Check the parts you forgot. Pads, doubled chords, a sample with its own bass in it, and room mics are common culprits. A high-pass on parts with no business down there helps the band above it too.
  4. Change notes before you change EQ. If the keys and guitar play the same chord in the same octave, moving one of them up an octave clears more mud than any filter.
  5. Leave the master bus for the end. Once the parts are sorted, a small bus move is polish. Before that, it just turns everything down at once.

Check it the honest way

Clearing mud makes a mix a little quieter, and quieter sounds worse for a second. So bounce the before and after, match their loudness, and flip between them in CoProducer’s A/B. If the words come forward and the low end still feels full, keep it. If it just sounds thinner, you cut the owner too, or cut too much.

Why does my mix sound muddy?
Usually because several tracks each put energy in the low mids, roughly 200 to 500 Hz, and it adds up. In our test the bus was 4.9 dB louder in that band than any single track.
Should I cut low mids on the master bus?
Not as the main fix. A 4 dB cut at 300 Hz on the bus lowered the band 3.2 dB but also took the vocal down 2.9 dB, so it only gained 0.6 dB of room.
What frequency causes mud in a mix?
It’s a band, not one frequency: the low mids, roughly 200 to 500 Hz, where most instruments keep their body. Find where it piles up in your song by sweeping with the full mix playing.
How do I make the vocal clearer in a muddy mix?
Cut the low mids a few dB on the parts that don’t need them. Cutting just the keys and guitar gave our test vocal 2.5 dB more room without touching the vocal.

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.