Provenance
How every figure was measured
The landing page prints numbers and gets out of the way. This is the apparatus behind them: the source file, the settings, the script and the date for each dataset, the full tables the landing page summarises, and the short list of figures that cannot be reproduced from this repository at all.
The hero diagram
Where the picture comes from
testdata/real_excerpt.wav, 40 s, asked for -8 LUFS against a -1.0 dBTP ceiling, which the engine's limiter delivered at -10.07 LUFS. That file was encoded with ffmpeg to libopus at 128k, decoded back to PCM, and measured. Each point is the highest sample of one 0.67 s window of the signal oversampled 4x, in dBTP. The maximum of each envelope is the true peak of that file, measured the same way engine.profile.true_peak_dbtp measures it.
Cross-check. The three figures were re-measured against website/data/codec_demo.json and the largest disagreement between the two datasets is 0.004 dB; the script refuses to write the file above 0.05 dB. Generated 2026-08-08 in 238 seconds by website/scripts/build_waveform_data.py.
How bad it gets depends on the track, which is the point. On this file the encoder did not push the peak past full scale. It ate the margin instead: 0.74 dB of the headroom you thought you had. You cannot tell in advance which of the two your track is, and that is the entire argument for measuring instead of assuming.
The interactive demo
Every level through every codec, in full
The landing page shows three columns per level. These are all of them, including the codec and bitrate each encode actually used and the resulting playback loudness.
Method. Source: testdata/real_excerpt.wav, 40.0 s, -13.87 LUFS, -4.41 dBTP, 48.0 kHz. At each level the file was normalised with the engine's limiter to a -1.0 dBTP ceiling, which is what a conventional mastering chain hands you. Every number under 'after codec' was produced by encoding the master to that platform's codec at its real bitrate with ffmpeg, decoding the result back to PCM, and measuring the true peak of the decoded audio at 16x oversampling. Nothing is predicted. Measured on the whole track. Playback loudness is derived, not measured: it is the measured integrated loudness of the master plus the platform's own normalisation rule. Generated 2026-08-08 in 213 seconds by website/scripts/build_demo_data.py.
Master aimed at -16 LUFS, delivered at -16.00 LUFS
| Platform | Codec | After codec | Lift | Verdict | Ours | Verdict | Playback |
|---|---|---|---|---|---|---|---|
| Spotify | libvorbis 320k | -6.45 | +0.10 | ok | -6.45 | ok | -14.0 |
| Apple Music | aac 256k | -6.21 | +0.34 | ok | -6.21 | ok | -16.0 |
| YouTube / YouTube Music | libopus 128k | -5.97 | +0.58 | ok | -5.97 | ok | -16.0 |
| TikTok / Reels / Shorts | aac 192k | -5.81 | +0.74 | ok | -5.81 | ok | -16.0 * |
| Amazon Music | aac 256k | -6.21 | +0.34 | ok | -6.21 | ok | -14.0 |
| SoundCloud / Bandcamp | libmp3lame 320k | -6.44 | +0.11 | ok | -6.44 | ok | -16.0 * |
Master aimed at -14 LUFS, delivered at -14.00 LUFS
| Platform | Codec | After codec | Lift | Verdict | Ours | Verdict | Playback |
|---|---|---|---|---|---|---|---|
| Spotify | libvorbis 320k | -4.46 | +0.09 | ok | -4.46 | ok | -14.0 |
| Apple Music | aac 256k | -4.29 | +0.26 | ok | -4.29 | ok | -16.0 |
| YouTube / YouTube Music | libopus 128k | -3.69 | +0.86 | ok | -3.69 | ok | -14.0 |
| TikTok / Reels / Shorts | aac 192k | -4.04 | +0.51 | ok | -4.04 | ok | -14.0 * |
| Amazon Music | aac 256k | -4.29 | +0.26 | ok | -4.29 | ok | -14.0 |
| SoundCloud / Bandcamp | libmp3lame 320k | -4.45 | +0.10 | ok | -4.45 | ok | -14.0 * |
Master aimed at -12 LUFS, delivered at -12.00 LUFS
| Platform | Codec | After codec | Lift | Verdict | Ours | Verdict | Playback |
|---|---|---|---|---|---|---|---|
| Spotify | libvorbis 320k | -2.39 | +0.16 | ok | -2.39 | ok | -14.0 |
| Apple Music | aac 256k | -2.48 | +0.07 | ok | -2.48 | ok | -16.0 |
| YouTube / YouTube Music | libopus 128k | -1.83 | +0.72 | ok | -1.83 | ok | -14.0 |
| TikTok / Reels / Shorts | aac 192k | -2.17 | +0.38 | ok | -2.17 | ok | -12.0 * |
| Amazon Music | aac 256k | -2.48 | +0.07 | ok | -2.48 | ok | -14.0 |
| SoundCloud / Bandcamp | libmp3lame 320k | -2.28 | +0.27 | ok | -2.28 | ok | -12.0 * |
Master aimed at -10 LUFS, delivered at -10.56 LUFS
| Platform | Codec | After codec | Lift | Verdict | Ours | Verdict | Playback |
|---|---|---|---|---|---|---|---|
| Spotify | libvorbis 320k | -0.98 | +0.04 | ok | -2.05 | ok | -14.0 |
| Apple Music | aac 256k | -0.92 | +0.10 | ok | -1.99 | ok | -16.0 |
| YouTube / YouTube Music | libopus 128k | -0.27 | +0.75 | tight | -1.55 | ok | -14.0 |
| TikTok / Reels / Shorts | aac 192k | -0.96 | +0.06 | ok | -1.84 | ok | -10.6 * |
| Amazon Music | aac 256k | -0.92 | +0.10 | tight | -1.99 | ok | -14.0 |
| SoundCloud / Bandcamp | libmp3lame 320k | -0.94 | +0.09 | ok | -1.72 | ok | -10.6 * |
Master aimed at -8 LUFS, delivered at -10.07 LUFS
| Platform | Codec | After codec | Lift | Verdict | Ours | Verdict | Playback |
|---|---|---|---|---|---|---|---|
| Spotify | libvorbis 320k | -0.88 | +0.14 | ok | -1.87 | ok | -14.0 |
| Apple Music | aac 256k | -0.76 | +0.26 | tight | -1.75 | ok | -16.0 |
| YouTube / YouTube Music | libopus 128k | -0.26 | +0.76 | tight | -1.51 | ok | -14.0 |
| TikTok / Reels / Shorts | aac 192k | -0.69 | +0.33 | tight | -1.72 | ok | -10.1 * |
| Amazon Music | aac 256k | -0.76 | +0.26 | tight | -1.75 | tight | -14.0 |
| SoundCloud / Bandcamp | libmp3lame 320k | -0.96 | +0.06 | ok | -1.93 | ok | -10.1 * |
Master aimed at -6 LUFS, delivered at -9.31 LUFS
| Platform | Codec | After codec | Lift | Verdict | Ours | Verdict | Playback |
|---|---|---|---|---|---|---|---|
| Spotify | libvorbis 320k | -0.86 | +0.16 | ok | -1.60 | ok | -14.0 |
| Apple Music | aac 256k | -0.80 | +0.22 | tight | -1.51 | ok | -16.0 |
| YouTube / YouTube Music | libopus 128k | -0.48 | +0.54 | tight | -1.22 | ok | -14.0 |
| TikTok / Reels / Shorts | aac 192k | -0.86 | +0.16 | ok | -1.45 | ok | -9.3 * |
| Amazon Music | aac 256k | -0.80 | +0.22 | tight | -1.51 | tight | -14.0 |
| SoundCloud / Bandcamp | libmp3lame 320k | -0.97 | +0.05 | ok | -1.72 | ok | -9.3 * |
Two honest wrinkles. Amazon Music asks for -2.0 dBTP where everyone else accepts -1.0 dBTP, so a master aimed at -1.0 dBTP cannot satisfy it and stays marked tight at most levels even after our pass. And at the loud end the limiter simply runs out of room: ask for -6 LUFS on this material and what comes out is -9.31 LUFS after 18.68 dB of gain reduction. Both are visible in the tables rather than rounded away. An asterisk on a playback figure means the platform does not normalise.
The before and after
One full pipeline run, start to finish
What you are hearing. One full pipeline run on testdata/real_excerpt.wav, 40 seconds at 48.0 kHz, matched to the modern_pop profile. Measured on the source before anything was done to it: -13.87 LUFS, -4.41 dBTP, stereo width 0.220, loudness range 2.42 LU, spectrum stopping at 20.1 kHz. The delivered master measures -14.20 LUFS and -1.77 dBTP, and its loudness range is 4.06 LU. Both previews are MP3 at 128 kbps, so you are also hearing a third encoder that has nothing to do with either file. The two players are level-matched with one broadband gain of +0.33 dB and no limiting.
On this track the tonal match is partial, and we will say so
It does not go to zero because the correction the matcher may apply per band is bounded, and this source starts a very long way out. After correction it still sits 8.4 dB above the target at 50 Hz and 8.5 dB below it at 6300 Hz. Closing a gap that size with a filter costs more in artefacts than the tonal move is worth. Note also what the figure does not cover: the engine measures this distance over 40 Hz to 16 kHz only, so the wall at 20.1 kHz sits almost entirely outside it, and a per-band spectrum distance says nothing whatsoever about stereo width, which on this source is 0.220.
What the repair stage did
| Step | Ran |
|---|---|
| DC offset | applied |
| Subsonic rumble | not needed |
| Silence at the head and tail | not needed |
| De-essing, 5.5 to 11 kHz | applied |
| Bass to mono below 120 Hz | not needed |
| Stereo repair | not needed |
| Fade on an abrupt ending | applied |
The delivered package, measured after every codec
| Platform | Codec | After codec | Playback | Verdict |
|---|---|---|---|---|
| Spotify | libvorbis 320k | -1.61 dBTP | -14.0 LUFS | ok |
| Apple Music | aac 256k | -1.69 dBTP | -16.0 LUFS | ok |
| YouTube / YouTube Music | libopus 128k | -1.06 dBTP | -14.4 LUFS | ok |
| TikTok / Reels / Shorts | aac 192k | -1.50 dBTP | -14.5 LUFS | ok |
| Amazon Music | aac 256k | -1.69 dBTP | -14.0 LUFS | tight |
| SoundCloud / Bandcamp | libmp3lame 320k | -1.60 dBTP | -14.4 LUFS | ok |
Read the rows that are not green. Nothing clips: every platform receives a file that stays under full scale after its own encoder. Amazon is the structural case: it asks for -2.0 dBTP, and a master aimed at -1.0 dBTP cannot reach that by construction. We print it anyway. The alternative is to widen the tolerance until the report is all green, which is what a tolerance is usually for.
Album mode
Three tracks, and what the run does not prove
| Track | Source LUFS | Delivered LUFS | Delivered dBTP | Loudness range | Distance to target |
|---|---|---|---|---|---|
| Track 1 | -12.74 | -14.00 | -5.10 | 2.53 LU | 0.99 to 0.92 dB |
| Track 2 | -13.77 | -14.00 | -3.69 | 3.42 LU | 1.68 to 1.25 dB |
| Track 3 | -13.07 | -14.00 | -4.80 | 0.68 LU | 1.19 to 0.98 dB |
What this measurement does not prove. These three tracks were already finished and already sat close together, which is a much easier starting point than twelve unrelated generations. So this run shows album mode tightening an already coherent set, not rescuing a scattered one. And the loudness spread landing at exactly 0.00 LU is arithmetic, not craft: three files normalised to one target are at one loudness whatever else you do to them.
Method. Three full-length tracks, one twenty-second excerpt cut from each at its loudest passage, mastered as one album against the set's own median spectrum. The spread figures are produced by engine.batch.ConsistencyReport, the same code that runs for a customer album. The excerpts are commercial material and are not published; only the measurements are. Target: album_average. A 20 second excerpt was cut from the loudest passage of each track with engine.platform_check.loudest_windows, from sources of 244, 237 and 209 seconds. Generated 2026-08-08 in 63 seconds by website/scripts/build_album_data.py.
The profiles
What each profile does
| Profile | Largest move | Bands moved | Delivered peak | Loudness range |
|---|---|---|---|---|
| Modern pop | +5.46 / -6.91 dB | 27 / 27 | -1.51 dBTP | 1.42 LU |
| Hip-hop and trap | +5.64 / -4.69 dB | 27 / 27 | -1.56 dBTP | 1.26 LU |
| EDM and dance | +5.47 / -6.11 dB | 27 / 27 | -1.81 dBTP | 1.05 LU |
| Lo-fi and chill | +2.83 / -7.76 dB | 26 / 27 | -1.86 dBTP | 1.48 LU |
| Acoustic and singer-songwriter | +5.30 / -8.17 dB | 25 / 27 | -1.68 dBTP | 1.32 LU |
| Rock and band | +5.12 / -7.86 dB | 27 / 27 | -1.35 dBTP | 1.65 LU |
| Pink reference | +5.15 / -7.28 dB | 27 / 27 | -1.50 dBTP | 1.41 LU |
| No EQ, loudness only | +0.00 / +0.00 dB | 0 / 27 | -5.13 dBTP | 0.69 LU |
- Modern pop
- Firm but controlled low end, a little taken out of the low mids so the vocal has room, presence around 3 kHz and air above it.
- Hip-hop and trap
- Heavy sub below 80 Hz, low mids cleared out so the 808 keeps its breathing room, and sharp hi-hats up top.
- EDM and dance
- Big sub, full mids for synths and leads, bright top. Wide stereo image, because that is what this genre lives on.
- Lo-fi and chill
- Warm low mids, top end deliberately rolled off from 8 kHz. A sensible choice for lossy source material: this profile does not ask for treble that is not there.
- Acoustic and singer-songwriter
- Close to neutral, with some warmth around 200 Hz and gentle air on top. Keeps the dynamics instead of flattening them.
- Rock and band
- Mids forward for guitars and snare, a tight low end, and a top end that does not turn harsh.
- Pink reference
- Pulls your track toward a straight pink slope, the spectral shape a lot of mixed music sits around. Note that this is not a bypass: a source that deviates from pink really is bent toward it. If you want nothing changed, choose “no EQ”.
- No EQ, loudness only
- Leaves your tone alone. Runs only the repairs you tick, puts the loudness on target and keeps the true peak safe after the codec. Pick this when your mix already sounds the way you want it.
The one number worth staring at. The no eq, loudness only profile comes out 0.03 dB from its target with a correction curve that is flat zero in all 27 bands. That is the proof that the setting does what its name says. The shaping profiles start 3.83 to 5.38 dB away from their targets and land 1.71 to 2.25 dB away. They do not reach zero either, because the per-band correction is bounded and this source starts a long way out. A profile that claimed 0.00 dB would be a profile that had stopped measuring.
Method. Source: style_source.wav, 20 s, -13.08 LUFS, -4.38 dBTP, spectrum stopping at 20.2 kHz. Each profile is one full master_track() run, then a single broadband gain to -14 LUFS with the peak held under -1.0 dBTP, then MP3 at 160 kbps. The largest single move any profile makes is +5.64 dB of boost and -8.17 dB of cut. It is deliberately one source and not 8 different songs: with a different track per genre you would mostly hear the difference between the tracks, which demonstrates the generator and not this tool. Generated 2026-08-08 in 171 seconds by website/scripts/build_style_examples.py.
The figures you cannot reproduce here
Measured with the same engine, on material we cannot publish
Everything above comes out of website/data/ and can be regenerated from this repository. The figures below cannot. They were measured with the same engine on tracks that are not ours to publish, and they are marked wherever they appear rather than folded in with the rest.
- Decorrelated bass folded to mono
- 8.8 dB lost before the correction that puts everything below 120 Hz in the centre, and 0.0 dB after it. This is the fourth figure on the landing page, and the only one there that is not from a published dataset.
- A master that came out of AAC above full scale
- -1.02 dBTP going in, +0.62 dBTP coming out. On a four-minute track YouTube's Opus encoder lifted the peak 1.46 dB, which forced the ceiling of the WAV down to -2.66 dBTP. Neither is reproducible from the demo above, which is exactly why the tool measures your file instead of applying a rule of thumb.
- Two-band limiting versus one broadband limiter
- Bass-driven modulation of the midrange sits around -28.5 dB with a single broadband limiter and -86 dB with the two-band limiter split at the same 120 Hz crossover.
- A more flattering album run than the one we published
- A different three-track set went from 2.28 to 1.28 dB per band and 7.47 to 0.24 LU. It is the better number and the one we cannot reproduce from anything published here, so the landing page shows the weaker one instead.
- Tonal distance on a full-length track
- 5.06 dB to 1.80 dB. Different material, different number, and we are not going to show you only the flattering one.
- The true-peak ceiling is a property, not a sample
- 110 tests, including the ceiling checked as a property across ten pathological signals at four ceilings and verified at 8x, 16x and 32x oversampling.
Delivery targets
What each platform asks for
| Platform | Target | True peak | Codec | Normalises | Confidence | Source |
|---|---|---|---|---|---|---|
| Spotify | -14 LUFS | -1.0 dBTP | libvorbis 320k | yes | primary | Spotify for Artists |
| Apple Music | -16 LUFS | -1.0 dBTP | aac 256k | yes | consensus | not published |
| YouTube / YouTube Music | -14 LUFS | -1.0 dBTP | libopus 128k | yes | consensus | not published |
| TikTok / Reels / Shorts | -14 LUFS | -1.0 dBTP | aac 192k | no | consensus | not published |
| Amazon Music | -14 LUFS | -2.0 dBTP | aac 256k | yes | consensus | not published |
| SoundCloud / Bandcamp | -14 LUFS | -1.0 dBTP | libmp3lame 320k | no | consensus | not published |