Linux MP3 CD Burning mini-HOWTO

Greg Wierzchowski


Revision History
Revision 2.02002-04-26Revised by: GW
Divided into two sections: existing material to section "audio", new section "data" on data CDs. Misc. additions.
Revision 1.52001-11-19Revised by: GW
Fixed omission in Disc-At-Once burning section.
Revision 1.42001-11-17Revised by: GW
Added Disc-At-Once burning section.
Revision 1.32001-09-02Revised by: GW
Added another example of decoding MP3 files with lame.
Revision 1.22001-07-12Revised by: GW
Minor layout changes; Added Translations subsection into Credits.
Revision 1.12001-06-12Revised by: GW
Minor cleanup; Regexp fix for MP3 to WAV name conversion example.
Revision 1.02001-05-29Revised by: GW
Initial Release.

Table of Contents
1. Introduction
1.1. Copyright and License
2. Audio CDs
2.1. Preparing the Tracks
2.2. Burning Your CD
2.3. Burning a DAO CD
2.4. Software
3. Data CDs
4. Credits
4.1. Translations
4.2. Other Credits

1. Introduction

This mini-HOWTO was created because of my experience with burning music CDs and lack of some specific information about sound normalization on the Internet. I usually burn music CDs as a mix - different songs from different sources.Very often volume level between songs varies greatly. This is the first obstacle. Second, many of the files on the Internet are not CD-compatible (16 bit, stereo, 44.1 kHz) and have to be converted. There are many programs to burn music CDs from MP3 files, and many of them do the conversion transparently. But I haven't seen a single tool that also normalizes the volume, so that's why I worked out my own CD-burning recipe.

This HOWTO is just about one thing - putting MP3 music on a CD, so that you can listen to it. For in-depth information about MP3 files, please look at The Linux MP3 HOWTO by Phil Kerr, located at For information about CD creation in general as well as CD burners, refer to CD-Writing-HOWTO by Winfried Trümper, available at

I'm assuming you wish to burn a CD with the collection of songs you obtained from different sources, all varying quality, but you want to get the best-sounding CD possible. This mini-HOWTO outlines the steps that may help you.

2. Audio CDs

2.1. Preparing the Tracks


All commands assume bash shell

  1. Collect all MP3 files in one directory.

  2. If your MP3 files came from DOS/Windows, they may have uppercase extensions. You can convert whole names to lowercase or just extensions. For everything lowercase do:

         for i in *.[Mm][Pp]3; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done 

    to convert just extensions:

         for i in *.MP3; do mv "$i" "`basename "$i" .MP3`.mp3"; done
  3. If any filenames contain spaces, first convert them to underscores:

         for i in *.mp3; do mv "$i" `echo $i | tr ' ' '_'`; done 
  4. Convert them to WAV with the command:

         for i in *.mp3; do mpg123 -w `basename $i .mp3`.wav $i; done 

    When decoding 22khz MP3 files the output of mpg123 may be distorted. To fix this, use:

         for i in *.mp3; do mpg123 --rate 44100 --stereo --buffer 3072 --resync -w `basename $i .mp3`.wav $i; done

    Mpg123 should be present in any Linux distribution, but if you don't have it, get it at

    NOTE I noticed that with some MP3 files mpg123 output was distorted. At first I thought that MP3's were bad, but then I checked with another player and they sounded OK. So I searched for another MP3 player that could write WAV files to disk, and found this one: MAD mp3 decoder at With madplayer, the command line is:

         for i in *.mp3; do madplay -o `basename $i .mp3`.wav $i; done 

    There is yet another way to do the conversion. Some MP3 files apparently give both mpg123 and madplay trouble with decoding. The lame encoder, which has a decoding mode, seems to handle difficult cases very well (lame can be found at :

         for i in *.mp3; do lame --decode $i `basename $i .mp3`.wav; done

    NOTE: The `basename $i .mp3`.wav command replaces MP3 extensions with WAV. There are 101 ways to do that, here's the alternative: `echo "$1" | sed 's/\.mp3$/.wav/'`

  5. Run "file *.wav" and check the output for any files different from 16 bit, stereo 44100 Hz.

  6. If there are files with different characteristics, convert them to the above specs. For example, to convert file track01.wav to obtain sample rate 44.1 kHz, you could use:

         sox track01.wav -r 44100 track01-new.wav resample

    or, if the above introduces static when converting mono files:

         sox track01.wav -r 44100 -c 2 track01-new.wav

    Sox is so popular, that it's probably installed by default with any Linux distribution, and can be obtained from However, the command-line options are somewhat cryptic for the casual user (me). Look at for some tips on usage.

  7. Normalize your WAV files, to avoid drastic differences in volume levels. I use a program by Chris Vaill (), called normalize - it can be obtained from

    I use the following syntax (-m is for mix mode, where all files should be as loud as possible):

         normalize -m *.wav

2.3. Burning a DAO CD

DAO, Disc-At-Once, is as of now the only method for burning a CD without a 2-second pause between the tracks. It's useful for burning party mixes. The program for burning CDs in DAO mode is cdrdao, available from SourceForge,

The cdrdao program uses description files called TOC (Table Of Contents, of course). There are two ways to create such file. First is to use a shell script, distributed with cdrdao source (in contrib directory, called It takes a list of .wav files as an argument and produces a cd.toc file. Second way is to simply create such file yourself in a text editor of your choice. Here is a self-explanatory example:


AUDIOFILE "mix-01.wav" 0

AUDIOFILE "mix-02.wav" 0

AUDIOFILE "mix-03.wav" 0

AUDIOFILE "mix-04.wav" 0

AUDIOFILE "mix-05.wav" 0

The 0 (zero) after the wave filename means start from the beginning of the file. There can be a second number providing the length (time) of file to record. The xcdroast creates similar TOC files, there are also examples in testtocs directory of cdrdao source.

The cdrdao by default uses the device /dev/cdrecorder, which should be a link to the cdwriter device. Assuming your cd recorder device file is /dev/scd0, create the link (as root) as follows:

ln -s /dev/scd0 /dev/cdrecorder

Then, assuming that the TOC file is named cd.toc the command to burn the cd is simply:

cdrdao write cd.toc

3. Data CDs


This section is a work in progress, you're looking at initial, very sparse version.

With increasing popularity of CD/MP3 players burning data CDs for listening purposes become practical. The advantage is definitely being able to squeeze ten times more music onto one CD (a very approximate figure). As far as MP3 data CD-s, they're just a regular, standard data CD's (ISO9660) with MP3 music as regular files. All MP3-CD players I know accept CD-s with directories in them, and I usually burn CD with Joliet extension and they work just fine. So to burn such a CD under linux, you first need to create an ISO image an then burn it on the CD as in the example below:

mkisofs -J -o /tmp/mymp3s.iso /home/greg/mp3s/
cdrecord dev=1,0,0 speed=16 /tmp/mymp3s.iso

That's it!

I have yet to research ability to normalize mp3 files directly - however I believe it always involves decompressing, normalization and then re-compressing the file, which introduces quality loss. Stay tuned!

4. Credits

Special thanks to all the people who contribute to the Linux community and who made this HOWTO possible.