CoProducer Measure a mix
Gold standing-wave lines stretched between two cyan-lit walls over gold-veined black marble, crossing at dark nodes above a warm glow on the floor

Monitoring · 19 October 2026 · 8 min

Your low end changes when you move your chair. That’s the room, not the mix

NoDAW Labs · Lacquer Vol. 05

If your 808 or bass gets louder or disappears when you lean back or roll the chair a foot, you’re hearing room modes: low frequencies that resonate between parallel walls (f = c ÷ 2L for each dimension) and pile up in some spots while cancelling in others. In an untreated room, don’t EQ the mix to your chair. Find a better seat, then check the low end on headphones, against references and on a meter.

Every bedroom producer has had this night. The 808 sounds perfect at the desk. You lean back to listen like a fan and it’s twice as big. You walk to the door and one note of the line just vanishes. Then the bounce goes to the car and it’s either boomy or gone, and you can’t tell which version of your room lied to you.

All of them, a little. Below a couple of hundred hertz a small room isn’t a neutral box. It’s a set of resonances, and where you sit decides which ones you hear.

What a room mode is

Bass wavelengths are long: about 8 m at 41 Hz, the low E of a lot of 808 lines. When half a wavelength fits exactly between two parallel walls, sound bouncing back and forth reinforces itself and the room resonates. That happens at f = c ÷ (2 × L), where c is the speed of sound (about 343 m/s) and L the distance between the walls, and again at every whole multiple of that frequency.

Each of those resonances has a fixed pattern in the room. Pressure is highest at the walls. For the first mode it drops to almost nothing halfway between them, so a seat in the middle of the room sits in a hole at that frequency. The second mode has two holes, at a quarter and three quarters of the way. And so on up.

These wall-to-wall ones are called axial modes, and they’re the strongest. There are weaker ones that bounce off four walls (tangential) or all six (oblique). In a bedroom-sized room they’re spread far enough apart that the low end behaves like a handful of separate peaks and holes rather than a smooth curve, until they get dense somewhere in the low hundreds of hertz.

Work out your own room’s modes

You need a tape measure and this. It lists the axial modes for each dimension, flags the ones that land on top of each other and the big gaps between them, and shows where the length-mode holes are:

#!/usr/bin/env python3
"""room_modes.py: axial room modes for a rectangular room, plus where they bunch up.
    python3 room_modes.py 3.6 3.0 2.4          # length width height in metres
    python3 room_modes.py 12 10 8 --ft         # or in feet
Axial modes (between two parallel walls) are the strongest: f = n * c / (2 * L).
Rigid-wall rectangle maths: a real room with doors, windows and stud walls will differ."""
import sys

C = 343.0                                    # speed of sound in m/s at about 20 °C
args = [a for a in sys.argv[1:] if not a.startswith("--")]
dims = [float(a) * (0.3048 if "--ft" in sys.argv else 1) for a in args] or [3.6, 3.0, 2.4]
names, top = ("length", "width", "height"), 300

modes = []
for name, L in zip(names, dims):
    n = 1
    while n * C / (2 * L) <= top:
        modes.append((n * C / (2 * L), name, n)); n += 1
modes.sort()

L, W, H = dims
print(f"room {L:.2f} x {W:.2f} x {H:.2f} m, axial modes up to {top} Hz")
for name, d in zip(names, dims):
    print(f"  {name:6s} {d:4.2f} m: " + ", ".join(f"{f:.1f}" for f, nm, _ in modes if nm == name) + " Hz")

print("\nall axial modes, low to high (gap = distance to the previous one)")
prev = None
for f, name, n in modes:
    gap = f - prev if prev else 0
    flag = ""
    if prev and gap < 0.05 * f: flag = "  <- within 5% of the last one: expect a pile-up"
    elif prev and gap > 20 and f < 200: flag = "  <- big gap below it: expect a hole"
    print(f"  {f:6.1f} Hz  {name} {n}  gap {gap:5.1f}{flag}")
    prev = f

print(f"\nlength-mode nulls sit at these distances from the front wall (m):")
for n in (1, 2, 3):
    print(f"  {n * C / (2 * L):5.1f} Hz: " + ", ".join(f"{(2 * k + 1) * L / (2 * n):.2f}" for k in range(n)))
print(f"38% of the length: {0.38 * L:.2f} m from the front wall (a starting point, not a cure)")
print(f"dead centre {L / 2:.2f} m sits in the null of every odd length mode")

For a common bedroom, 3.6 × 3.0 × 2.4 m (about 12 × 10 × 8 ft):

$ python3 room_modes.py 3.6 3.0 2.4
room 3.60 x 3.00 x 2.40 m, axial modes up to 300 Hz
  length 3.60 m: 47.6, 95.3, 142.9, 190.6, 238.2, 285.8 Hz
  width  3.00 m: 57.2, 114.3, 171.5, 228.7, 285.8 Hz
  height 2.40 m: 71.5, 142.9, 214.4, 285.8 Hz

all axial modes, low to high (gap = distance to the previous one)
    47.6 Hz  length 1  gap   0.0
    57.2 Hz  width 1  gap   9.5
    71.5 Hz  height 1  gap  14.3
    95.3 Hz  length 2  gap  23.8  <- big gap below it: expect a hole
   114.3 Hz  width 2  gap  19.1
   142.9 Hz  length 3  gap  28.6  <- big gap below it: expect a hole
   142.9 Hz  height 2  gap   0.0  <- within 5% of the last one: expect a pile-up
   171.5 Hz  width 3  gap  28.6  <- big gap below it: expect a hole
   190.6 Hz  length 4  gap  19.1
   214.4 Hz  height 3  gap  23.8
   228.7 Hz  width 4  gap  14.3
   238.2 Hz  length 5  gap   9.5  <- within 5% of the last one: expect a pile-up
   285.8 Hz  length 6  gap  47.6
   285.8 Hz  width 5  gap   0.0  <- within 5% of the last one: expect a pile-up
   285.8 Hz  height 4  gap   0.0  <- within 5% of the last one: expect a pile-up

length-mode nulls sit at these distances from the front wall (m):
   47.6 Hz: 1.80
   95.3 Hz: 0.90, 2.70
  142.9 Hz: 0.60, 1.80, 3.00
38% of the length: 1.37 m from the front wall (a starting point, not a cure)
dead centre 1.80 m sits in the null of every odd length mode

A few things jump out. Nothing at all below 47.6 Hz, so an E1 at 41 Hz gets no help from the length of the room. Three modes in the first 72 Hz, then a 24 Hz hole before 95 Hz. And 142.9 Hz is shared by the length and the height, because 3.6 m is exactly one and a half times 2.4 m. Builders love neat ratios. Rooms with neat ratios stack their modes, and a stacked mode is a note that rings.

Same 808, seven chairs

Mode frequencies tell you where the trouble is. They don’t tell you what your seat hears. For that we ran a textbook modal model of the same room. It’s computed, not measured: rigid walls, a low-frequency decay of 0.6 s (a typical untreated small room), two speakers 0.6 m from the front wall and 0.9 m from the side walls playing mono bass, and a listener centred left to right with ears at 1.1 m. Each number is the level at that seat compared with the room’s average at that frequency (averaged over 1,100 points), so 0 dB means the seat hears what the room does on average.

Seat (from front wall)E1 41 HzG1 49 HzA1 55 HzC2 65 HzD2 73 Hz100 Hz808 line, loudest − quietest note
25% (0.90 m)−1.3+0.6+0.4−3.1−7.3−5.27.8 dB
32% (1.15 m)−5.7−1.5−0.3−0.9−2.3−1.85.4 dB
38% (1.37 m)−11.7−4.4−2.3−1.5−1.6+1.410.2 dB
45% (1.62 m)−18.2−10.5−6.2−3.5−2.1+3.316.0 dB
50%, dead centre (1.80 m)−9.8−20.0−10.6−5.3−2.6+3.517.4 dB
62% (2.23 m)−1.9−6.2−10.9−30.4−9.9+1.628.6 dB
Near the back wall (3.30 m)+3.9+2.9+2.2+1.4−2.4+0.16.3 dB

The 808 line is E1, G1, A1, C2, D2. Real rooms leak bass through doors, windows and stud walls, so they’re usually less extreme than a rigid-wall model. The pattern is what to take away, and it’s not subtle:

And no seat is flat. Scanning 35–120 Hz in quarter-hertz steps, every seat had at least 16 dB between its loudest and quietest point, and the 62% seat had 37 dB. That’s why you don’t trust any single chair with the low end. You use the room for what it’s good at and check the bass somewhere else.

Checks that work without treatment

  1. Find the least-bad seat. Start around 38% of the room length, away from the exact centre, speakers symmetric. Play the tones below and move your head forward and back in 15–30 cm steps. Pick the spot where the notes sound most even, then mark the floor so you sit there every time.
  2. Listen to steps, not songs. A song hides the room because the notes keep moving. Stepped sine tones let you name the note that booms and the one that vanishes. A slow sine sweep works too, but steps are easier to write down.
  3. Measure if you can. An inexpensive measurement mic and free room-analysis software (REW is the one most people use) will draw the curve your ears are guessing at. Measure a few points around your head and average them; one point is as misleading as one chair.
  4. Check the bass on headphones, in mono. Headphones skip the room entirely. They’re not perfect in the sub, but they don’t have nulls that move with your head. Play the 808 line in mono and listen for notes that jump out or drop away.
  5. Compare against references in the same seat. Level-match two or three released tracks in your genre and flip between them and your mix. The room colours all of them the same way, so you’re judging the difference, which is the part that survives the trip to the car.
  6. Read a meter that can’t hear your room. A spectrum view or a reference comparison reads the file, not the air. CoProducer’s reference match lines your bounce up against a reference metric by metric and shows where it diverges, and that answer doesn’t change when you roll your chair.
  7. Then translate. Car, earbuds, phone. Last, not first, because by then you already know what the low end should be.

Here are the tones. Twelve notes from E1 to E3, two seconds each, at a safe −18 dBFS peak, with a cue list so you know what you’re hearing:

#!/usr/bin/env bash
# bass_steps.sh: stepped sine tones for a by-ear room check (2 s each, 0.5 s gap, -18 dBFS peak).
#   ./bass_steps.sh            -> bass_steps.wav plus a cue list of which tone plays when
# Play it at a moderate level, sit still, and note which tones jump out or vanish.
# Then move 30 cm and play it again.
set -euo pipefail
notes=("E1 41.2" "F1 43.7" "G1 49.0" "A1 55.0" "B1 61.7" "C2 65.4" "D2 73.4" "E2 82.4" "G2 98.0" "A2 110.0" "C3 130.8" "E3 164.8")
inputs=(); filt=""; i=0; t10=0   # time in tenths of a second
for n in "${notes[@]}"; do
  set -- $n
  inputs+=(-f lavfi -i "aevalsrc=0.126*sin(2*PI*$2*t)*min(1\,min(t\,2-t)/0.02):s=48000:d=2")
  inputs+=(-f lavfi -i "anullsrc=r=48000:cl=mono:d=0.5")
  filt+="[$((2*i)):a][$((2*i+1)):a]"
  printf "%3d.%d s  %-3s %6s Hz\n" $((t10 / 10)) $((t10 % 10)) "$1" "$2"
  t10=$((t10 + 25)); i=$((i+1))
done
ffmpeg -v error -y "${inputs[@]}" -filter_complex "${filt}concat=n=$((2*i)):v=0:a=1[out]" -map "[out]" -c:a pcm_s24le bass_steps.wav
echo "wrote bass_steps.wav ($(ffprobe -v error -show_entries format=duration -of csv=p=0 bass_steps.wav) s)"
$ ./bass_steps.sh
  0.0 s  E1    41.2 Hz
  2.5 s  F1    43.7 Hz
  5.0 s  G1    49.0 Hz
  7.5 s  A1    55.0 Hz
 10.0 s  B1    61.7 Hz
 12.5 s  C2    65.4 Hz
 15.0 s  D2    73.4 Hz
 17.5 s  E2    82.4 Hz
 20.0 s  G2    98.0 Hz
 22.5 s  A2   110.0 Hz
 25.0 s  C3   130.8 Hz
 27.5 s  E3   164.8 Hz
wrote bass_steps.wav (30.000000 s)

Write down what jumps and what vanishes at your seat, then move 30 cm and do it again. In five minutes you’ll know which notes of your 808 line you can’t trust from that chair.

Small fixes that actually help

Genre notes

Why does my bass sound different in different parts of the room?
Room modes. Low frequencies resonate between parallel walls at f = c ÷ 2L and its multiples, and each resonance is loud in some places and cancelled in others. In our computed example of a 3.6 m room, moving 30 cm front to back changed a 49 Hz note by 8 dB.
Where should I sit to mix in an untreated room?
Start around 38% of the room length from the front wall, never at the exact centre, with the speakers symmetric to the side walls. Then test with stepped tones or a measurement mic and move until the low notes are most even. In our example room the best seat was at 32%.
Can EQ fix room modes?
Partly. Cutting a peak that booms at your seat helps. Boosting a null does not, because the room cancels that frequency at that spot and the extra energy just costs headroom. Seat position, symmetry and thick bass trapping do more.
Should I mix the low end on headphones?
Use them to check it. Headphones skip the room, so the level of each 808 note doesn’t change when you move. Combine that with level-matched references and a meter, then confirm the result on speakers, in the car and on a phone.

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.