Why are our mastered files 16-bit WAV and not 24-bit?
Mastering · 3 min read
We deliver 16-bit WAV because a DJ's CDJs would not load our 24-bit masters, and because on a loud, limited club track 16 bits already put the rounding error about 98 dB under full scale, far below what a club room lets anyone hear.
When we logged the fix, we wrote "CDJ hardware can't read 24-bit WAV". That was too broad.
The report
A DJ told us their 24-bit masters would not load on their CDJs. We switched delivery to 16-bit the same day, 2026-09-12. The report named no model, firmware or error.
Most likely the header, not the bit depth
All nine Pioneer DJ and AlphaTheta manuals we read list 24-bit WAV, the CDJ-3000 and CDJ-2000NXS2 ones included (all nine: Which audio files does a CDJ actually load?). What else changed is the header: FFmpeg, which writes our final file, gives every WAV wider than 16 bits a longer one, Microsoft's WAVE_FORMAT_EXTENSIBLE.
DJs report that Pioneer players refuse that header at supported bit depths, and that rewriting the tag makes the same samples load (community sources, at the end of Sources). We found no AlphaTheta document saying so. Our switch removed both suspects at once. The manuals point at the header; without the player model we cannot say which it was. Delivery stays 16-bit either way.
Why 16 bits are enough in a club
Rounding each sample to a 16-bit step leaves an error 98 dB under a full-scale sine (the 96 dB often quoted is full scale over one step); 24 bits push it to 146 dB. A limited club master sits a few dB under full scale for its whole length (Club loudness, measured), so the error never comes near the music.
Listening tests agree: a 16-bit bottleneck went unnoticed at normal-to-loud levels, heard only with 20 dB of extra gain on near-silent passages, in a 2007 test. A 2016 meta-analysis finds a small but statistically significant ability to hear high resolution, larger with training; it pools sample rate and bit depth, so it does not single out 16 bits.
No dither, on purpose
Going from our 24-bit working file to 16-bit is a rounding. The textbook way adds dither, a tiny noise that turns the error into a steady hiss. We do not:
On a club master that happens only at the tail of a fade, under the next track. Dither would change every sample we deliver and force a full re-check of the engine, for a benefit below the room's noise.
What this does not tell you
- Which player failed, or why. No model, firmware or error was recorded. Header versus bit depth is read from documents, not tested on their decks.
- Every player. Our nine manuals are Pioneer DJ and AlphaTheta models. Check yours.
- Studio use. Turned down hard and re-rendered, 16-bit undithered leaves less room than 24-bit.
How we measured, with every number
Method. Synthetic sine tones only, no music; nothing here is a loudness or peak measurement. We ran the final stage of our mastering engine exactly as it runs in production (the same FFmpeg filter chain and output codec, taken from the code), once with today's 16-bit codec and once with the 24-bit codec it replaced, then read the WAV header back byte by byte and looked at the output sample values. FFmpeg 6.1.1 on our development machine. Scripts: content-social/drafts/scripts/I15_delivery_format.py (header, arithmetic, dither test), I3_wav_headers.py (header lengths), I15_figures.py (figures). No CDJ was tested; player capabilities come from the manufacturer's manuals.
The report. The files were 24-bit, 44.1 kHz stereo, which is 2116.8 kbps; a 16-bit file at the same rate is 1411.2 kbps, the figure those decks were happy with. We did not ask at the time which model, firmware or medium (USB or SD) was used, or what the player showed. Every mastered file since 2026-09-12 is 16-bit.
The manuals.
| Player | Manual | WAV bit depth | WAV sample rates |
|---|---|---|---|
| CDJ-3000 | Instruction Manual DRI1586-A, "Supported file formats" | 16 bit, 24 bit | 44.1, 48, 88.2, 96 kHz |
| CDJ-2000NXS2 | Operating Instructions DRI1290-A, "Playable music file formats" | 16 bit, 24 bit | 44.1, 48, 88.2, 96 kHz (not 88.2/96 kHz WAV from a disc) |
Both add that some files cannot be played even in a supported format, without saying which. The other seven models we read (CDJ-900NXS, CDJ-2000NXS, CDJ-3000X, XDJ-1000MK2, XDJ-XZ, XDJ-RX3, OPUS-QUAD) list 24-bit WAV too; their manuals and the full table are in Which audio files does a CDJ actually load?.
The header our final pass writes. A WAV file's format header starts with a tag that says how to read the rest. FFmpeg picks it on its own:
| Codec in our final pass | Rate | Bits | Format tag | fmt length |
|---|---|---|---|---|
| 16-bit PCM (delivered today) | 44.1 kHz | 16 | 0x0001 WAVE_FORMAT_PCM |
16 bytes |
| 16-bit PCM (delivered today) | 48 kHz | 16 | 0x0001 WAVE_FORMAT_PCM |
16 bytes |
| 24-bit PCM (before 2026-09-12) | 44.1 kHz | 24 | 0xFFFE WAVE_FORMAT_EXTENSIBLE |
40 bytes |
| 24-bit PCM (before 2026-09-12) | 48 kHz | 24 | 0xFFFE WAVE_FORMAT_EXTENSIBLE |
40 bytes |
WAVE_FORMAT_EXTENSIBLE is Microsoft's extended header for "more than two channels or higher sample resolutions". It describes the same stereo PCM samples in a longer form: its sub-format field reads PCM (0x0001). FFmpeg uses it for any PCM sample wider than 16 bits, and for any rate above 48 kHz. The tag and bit columns come from the production final pass; the lengths from the same FFmpeg rule on a generated tone (I3_wav_headers.py).
Quantisation arithmetic.
| 16-bit | 24-bit | |
|---|---|---|
| Ratio of full scale to one step | 96.3 dB | 144.5 dB |
| Full-scale sine to rounding error (6.02 N + 1.76 dB) | 98.1 dB | 146.2 dB |
| Rounding error, RMS | -101.1 dBFS | -149.2 dBFS |
| Data rate, stereo at 44.1 kHz | 1411.2 kbps | 2116.8 kbps |
The room. Swiss law caps amplified events at 100 dB(A) averaged over an hour and 125 dB(A) at any moment. A full-scale tone at 125 dB would put 16-bit error at 125 - 98.1 = 26.9 dB SPL. This is a deliberately loose worst case: the limit is A-weighted, the error figure is not, and a full-scale sine is not music. The CDJ-3000 manual specifies a 115 dB signal-to-noise ratio at its analog output: more than 16 bits, less than 24.
The listening tests. Meyer and Moran inserted a 16-bit / 44.1 kHz A/D/A loop into high-resolution playback and found it undetectable at normal-to-loud levels, by every listener, on every system; it became audible only with the gain raised 20 dB above normal on a looped passage of room tone and a couple of very quiet notes. Reiss's meta-analysis of 18 experiments found a small but statistically significant ability to tell high-resolution audio apart, growing with training. It pools sample rate and bit depth. Neither tested a limited club master on a club system; what they show is where 16-bit can be heard: quiet material and a lot of gain.
Dither test. 997 Hz stereo tones written as 24-bit (like our internal working file) and sent through the production final pass at 44.1 kHz, 2 s each, filter edges skipped:
| Input tone | Output samples (16-bit) |
|---|---|
| 0.4 of one 16-bit step | all 158760 are 0: the tone disappears |
| 0.6 of one 16-bit step | 29792 at -1, 99774 at 0, 29194 at +1: a coarse three-level wave |
That is undithered rounding to the nearest step; truncation would have mapped 0.6 to zeros or to {-1, 0}, and any dither spreads both tones over many values. The figure draws round-to-nearest of the same tone; its share of nonzero samples matches the measured 37% (checked in I15_figures.py). On a club master this happens only around 96 dB down, at the end of a fade. Every change to our sample path means re-verifying the engine's output against a fixed set of test renders, which is why we do not add dither.
More limits.
- Whether the original decks were re-tested with the 16-bit files.
- Production versus this machine. We ran FFmpeg 6.1.1 locally, not inside the production container.
Related
- Which audio files does a CDJ actually load?
- Why does our mastering engine return the same file every time?
- Does WAV sound better than a 320 MP3 on a club system?
- Club loudness, measured
Sources
- AlphaTheta Corporation, CDJ-3000 Instruction Manual, DRI1586-A (2020): "Supported file formats", p. 13; "Specifications", p. 82. Official support: https://www.pioneerdj.com/support/ (copy read: https://cdn01.4wall.com/cms/rentals/files/f6835e4eabc543.pdf)
- Pioneer DJ, CDJ-2000NXS2 Operating Instructions, DRI1290-A (2015): "Playable music file formats", p. 6. Official support: https://www.pioneerdj.com/support/ (copy read: https://imagescdn.juno.co.uk/manual/598186-01U.pdf)
- Microsoft, WAVEFORMATEXTENSIBLE structure (mmreg.h), Win32 API reference. https://learn.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-waveformatextensible
- FFmpeg,
libavformat/riffenc.c, functionff_put_wav_header. https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/riffenc.c - S. P. Lipshitz, R. A. Wannamaker, J. Vanderkooy, "Quantization and Dither: A Theoretical Survey", Journal of the Audio Engineering Society 40(5), 1992, pp. 355-375. https://aes2.org/publications/elibrary-page/?id=7047 . For the 6.02 N + 1.76 dB derivation: W. Kester, Taking the Mystery out of the Infamous Formula, "SNR = 6.02N + 1.76dB", Analog Devices tutorial MT-001. https://www.analog.com/media/en/training-seminars/tutorials/MT-001.pdf
- E. B. Meyer, D. R. Moran, "Audibility of a CD-Standard A/D/A Loop Inserted into High-Resolution Audio Playback", Journal of the Audio Engineering Society 55(9), 2007, pp. 775-779. https://aes2.org/publications/elibrary-page/?id=14195 . Authors' notes: https://bostonaudiosociety.org/explanation.htm
- J. D. Reiss, "A Meta-Analysis of High Resolution Audio Perceptual Evaluation", Journal of the Audio Engineering Society 64(6), 2016, pp. 364-379. https://aes2.org/publications/elibrary-page/?id=18296
- Swiss Federal Office of Public Health (BAG), Schall: Anforderungen der V-NISSG (Verordnung zum Bundesgesetz über den Schutz vor Gefährdungen durch nichtionisierende Strahlung und Schall), limits for events with amplified sound. https://www.bag.admin.ch/de/schall-anforderungen-v-nissg
See also (community, not primary): J. Selway, Pioneer DJ file formats table compiled from user manuals, https://github.com/joeselway/Pioneer-DJ-File-Formats ; pioneer-wav-fixer, a tool that rewrites the extensible tag, https://github.com/7olstoy/pioneer-wav-fixer
We build enguetedl.ch; the mastering engine described above is ours.