[mad-dev] Replay Gain

Rob Leslie rob@mars.org
Tue, 24 Feb 2004 16:22:41 -0800


I've been asked to elaborate a bit on Replay Gain and the issues 
surrounding it, as they relate to MAD and LAME.

The Replay Gain proposed standard was set forth in 2001 by David 
Robinson and can be viewed here:

     http://www.replaygain.org/

First it's important to understand that Replay Gain has absolutely no 
bearing on the libmad proper; it doesn't affect the actual decoding 
process whatsoever, and libmad has no knowledge of Replay Gain 
structures or semantics.

By cooperative agreement with encoders and other tools, applications 
can use Replay Gain information to adjust the volume of decoded audio 
to achieve approximately equal loudness across an entire collection of 
music. madplay does this when enabled with the -G (--replay-gain) 
option.

The proposed standard describes a method for computing Replay Gain 
adjustments, which in any case are just decibel scalefactors. 
Essentially the energy of the encoded signal is calibrated against a 
reference level, and the difference is stored as the Replay Gain 
adjustment value. The reference level set forth in the proposed 
standard is the SMPTE-sanctioned 83 dB SPL, representing a comfortable 
average listening level.

When Replay Gain is enabled, players are encouraged to supply a default 
pre-amp gain of at least +6 dB in addition to the Replay Gain 
adjustment. This is so pop music for example does not sound too quiet, 
but the pre-amp might be reduced or disabled for other types of music. 
madplay supports this with the existing -a (--amplify, --attenuate) 
option, which now has a default value of +6 dB when Replay Gain is 
enabled.

Replay Gain information can be stored in a variety of possible 
locations, for example in an ID3v2 tag. Recent versions of LAME 
automatically compute Replay Gain data and store it in the LAME info 
tag:

     http://gabriel.mp3-tech.org/mp3infotag.html

When enabled, madplay reads and honors Replay Gain from either of these 
locations.

So what was the purpose of the changes in madplay 0.15.2b?

It turns out that versions of LAME since 3.95.1 do not strictly follow 
the Replay Gain proposed standard. Instead of using the specified 83 dB 
SPL reference level (as LAME did in version 3.95) LAME now uses a 
reference of 89 dB SPL. That means the Replay Gain adjustment computed 
by LAME is now 6 dB greater than what is specified by the proposed 
standard, and players that implement the recommended pre-amp gain on 
top of that will amplify the signal too much -- and often cause 
clipping.

Why did LAME do this? According to Gabriel Bouvigne, one of the LAME 
developers, "we had a discussion about it with David (ReplayGain 
author), and reached the conclusion that as the vast majority of 
implementations are using 89dB, we should take this infortunate 
situation into consideration and update the standard to 89dB." (But to 
my knowledge the proposed standard has yet to be updated.)

The unfortunate effect of this heresy is that players have to know what 
reference value the Replay Gain adjustment was computed relative to, 
for it can no longer be assumed to be the 83 dB SPL specified in the 
proposed standard. Accordingly, special logic was added to madplay to 
detect LAME tags written since 3.95.1.

And there you have it.

Cheers,

-- 
Rob Leslie
rob@mars.org