You want to burn an audio CD from a bunch of audio files from various sources, not direct CD rips? You can use open source tools to check the properties of the tracks and prepare them properly to avoid potential pitfalls and ensure a better listening experience.
The tools used in this memo:
Some of these do have overlapping functionality. With the exception of wavbreaker (needs ALSA/OSS), all of them are available on both OS X and Linux.
Installation on Ubuntu:
$ sudo apt-get install sndfile-programs sox normalize-audio wavbreaker shntool cuetoolsPlease note that the following changes to wav files are destructive so be sure to operate on copies of the originals.
Normalize
Check if the tracks need normalization.
$ sndfile-info *.wav | egrep 'File|Signal Max'
File : 01.wav Signal Max : 16462 (-5.98 dB) File : 02.wav Signal Max : 19946 (-4.31 dB) File : 03.wav Signal Max : 24188 (-2.64 dB) File : 04.wav Signal Max : 12092 (-8.66 dB) File : 05-06.wav Signal Max : 16781 (-5.81 dB) File : 07.wav Signal Max : 32768 (0.00 dB) File : 08-09.wav Signal Max : 27442 (-1.54 dB)
So there is one with a really loud peak (07.wav) and a few bit quieter tracks. This is what normalize-audio suggests to do (gain column):
$ normalize-audio -n *.wav
level peak gain -12,6922dBFS -5,9791dBFS 0,6922dB 01.wav -14,3614dBFS -4,3119dBFS 2,3614dB 02.wav -15,2635dBFS -2,6370dBFS 3,2635dB 03.wav -22,4749dBFS -8,6588dBFS 10,4749dB 04.wav -15,9599dBFS -5,8126dBFS 3,9599dB 05-06.wav -13,3062dBFS 0,0000dBFS 1,3062dB 07.wav -13,3358dBFS -1,5407dBFS 1,3358dB 08-09.wav
To go with automatic settings:
$ normalize-audio *.wav
Applying adjustment of 0,69dB to 01.wav... Applying adjustment of 2,36dB to 02.wav... Applying adjustment of 3,26dB to 03.wav... Applying adjustment of 10,47dB to 04.wav... Applying adjustment of 3,96dB to 05-06.wav... Applying adjustment of 1,31dB to 07.wav... Applying adjustment of 1,34dB to 08-09.wav...
I really didn't like what this did to track 04.wav, so I reverted it back from the backups and adjusted a smaller gain manually:
$ normalize-audio -g 2,5dB 04.wav
Applying adjustment of 2,500000dB... 04.wav 100% done, ETA 00:00:00 (batch 100% done, ETA 00:00:00)
See normalize-audio --help for more controls. Normalization does not adjust signal-to-noise ratio, but trust your ears and speakers when adjusting volume. The desired peak level is within range -1,0 .. -6,0 dB. See Wikipedia.
Resample to Red Book CD standard
Convert the tracks to CD audio format (stereo, 16 bit, 44100 Hz). First check their current sample rate:
$ sndfile-info *.wav | egrep 'File| Channels| Sample Rate| Bit Width'
File : 01.wav Channels : 2 Sample Rate : 48000 Bit Width : 16 File : 02.wav Channels : 2 Sample Rate : 48000 Bit Width : 16 File : 03.wav Channels : 2 Sample Rate : 48000 Bit Width : 16 File : 04.wav Channels : 2 Sample Rate : 44100 Bit Width : 16 File : 05-06.wav Channels : 2 Sample Rate : 48000 Bit Width : 16 File : 07.wav Channels : 2 Sample Rate : 44100 Bit Width : 16 File : 08-09.wav Channels : 2 Sample Rate : 44100 Bit Width : 16
Here I have a bunch of files in incompatible sampling rate. SoX can do many things to audio files, including resampling.
$ sox inputfile.wav -r 44100 -b 16 -c 2 outputfile.wav
I converted the 48 kHz files with this ad-hoc loop:
$ IFS=$'\n' ;\ for f in $(\ sndfile-info *.wav |\ egrep 'File|^Sample Rate' |\ grep -B 1 48000 |\ awk -F' : ' /File/{'print $2'}); do \ sox "${f}" -r 44100 -b 16 -c 2 "${f}-44k1.wav" && rm -f "${f}" ; done
Eliminate sector boundary errors (SBE)
To make sure there won't be any clicks between tracks, when the audio is continuous over a track change segue, you need to ensure the proper length of each track. On disc, tracks begin at full sectors, and a single sector length is 1/75 sec. If the wav of previous track is just slightly too short, the cd burner will insert some silence where audio is missing, to fill out the sector. This is enough to cause an annoying click in some cd players.
shntool is a great tool for extracting information and manipulating audio files. I will not give an example here, but see the output from shntool info *.wav to examine the properties of your wave files.
Examine the output of the shntool len command to discover problems:
$ shntool len *.wav
length expanded size cdr WAVE problems fmt ratio filename 3:43.65 39490508 B -b- -- ----- wav 1.0000 01.wav-44k1.wav 5:40.02 59979756 B -b- -- ----- wav 1.0000 02.wav-44k1.wav 4:26.66 47076708 B -b- -- ----- wav 1.0000 03.wav-44k1.wav 2:22.08 25067660 B --- -- ----- wav 1.0000 04.wav 5:53.48 62382468 B -b- -- ----- wav 1.0000 05-06.wav-44k1.wav 4:36.65 48838628 B -b- -- ----- wav 1.0000 07.wav 7:39.68 81128396 B -b- -- ----- wav 1.0000 08-09.wav 34:23.22 363964124 B 1.0000 (7 files)The b in the cdr column indicates a SBE. The hyphen indicates that everything is OK.
I wrote a small script called sbeok to check wav for SBEs. You can either use the script or shntool.
$ sbeok *.wav
01.wav-44k1.wav: FAILED, missing 1968 bytes 02.wav-44k1.wav: FAILED, missing 992 bytes 03.wav-44k1.wav: FAILED, missing 968 bytes 04.wav: OK 05-06.wav-44k1.wav: FAILED, missing 2024 bytes 07.wav: FAILED, missing 696 bytes 08-09.wav: FAILED, missing 1536 bytes
Seems all but track 04.wav has improper length and a small amount of silence would be added to the end of these tracks while burning the cd. Additionally, there are two files: 05-06.wav and 08-09.wav that need to be cut and they have music during the segue.
The brute force approach to recalculate sector boundaries is to merge all wavs into one and manually insert the track markers. This has the benefit that you don't need to cut tracks in previous steps of your workflow, but to leave it until last.
Merge all tracks together with shnjoin.
$ shnjoin *.wav
Joining [01.wav-44k1.wav] (3:43.65) --> [joined.wav] (34:23.22) : 100% OK Joining [02.wav-44k1.wav] (5:40.02) --> [joined.wav] (34:23.22) : 100% OK Joining [03.wav-44k1.wav] (4:26.66) --> [joined.wav] (34:23.22) : 100% OK Joining [04.wav] (2:22.08) --> [joined.wav] (34:23.22) : 100% OK Joining [05-06.wav-44k1.wav] (5:53.48) --> [joined.wav] (34:23.22) : 100% OK Joining [07.wav] (4:36.65) --> [joined.wav] (34:23.22) : 100% OK Joining [08-09.wav] (7:39.68) --> [joined.wav] (34:23.22) : 100% OK Post-padded output file with 1128 zero-bytes.
Use wavbreaker to set track split markers.
$ wavbreaker joined.wav
This opens up a friendly GUI to insert your track marks. Seek to proper position in the topmost waveform view, and adjust the exact cut point from the second-to-top view. Click "Add" to enter a marker .. the interface is very easy to use. You could split the tracks from within wavbreaker, but once you have the marker file, it is possible to script the whole process. "Export to TOC" into file master.toc and exit the program.
Use shnsplit with cuebreakpoints to split the files based on the TOC. Write the master CD cast to directory "master":
$ mkdir master $ cuebreakpoints -i toc master.toc | shnsplit -t %n -d master joined.wav
Splitting [joined.wav] (34:23.22) --> [master/01.wav] (3:44.44) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/02.wav] (5:40.54) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/03.wav] (4:25.48) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/04.wav] (2:23.67) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/05.wav] (3:23.38) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/06.wav] (2:28.05) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/07.wav] (4:36.48) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/08.wav] (1:18.24) : 100% OK Splitting [joined.wav] (34:23.22) --> [master/09.wav] (6:21.69) : 100% OK
How about those sector sizes now?
$ sbeok master/*.wav
master/01.wav: OK master/02.wav: OK master/03.wav: OK master/04.wav: OK master/05.wav: OK master/06.wav: OK master/07.wav: OK master/08.wav: OK master/09.wav: OK
$ shntool len master/*.wav
length expanded size cdr WAVE problems fmt ratio filename 3:44.44 39617132 B --- -- ----- wav 1.0000 master/01.wav 5:40.22 60027788 B --- -- ----- wav 1.0000 master/02.wav 4:26.05 46934204 B --- -- ----- wav 1.0000 master/03.wav 2:23.67 25382828 B --- -- ----- wav 1.0000 master/04.wav 3:21.15 35491724 B --- -- ----- wav 1.0000 master/05.wav 2:30.28 26525900 B --- -- ----- wav 1.0000 master/06.wav 4:36.48 48799340 B --- -- ----- wav 1.0000 master/07.wav 1:18.24 13815692 B --- -- ----- wav 1.0000 master/08.wav 6:21.69 67370732 B --- -- ----- wav 1.0000 master/09.wav 34:23.22 363965340 B 1.0000 (9 files)
Looks good. How are the volume levels?
File : master/01.wav Signal Max : 22620 (-3.22 dB) File : master/02.wav Signal Max : 28166 (-1.31 dB) File : master/03.wav Signal Max : 29384 (-0.95 dB) File : master/04.wav Signal Max : 16501 (-5.96 dB) File : master/05.wav Signal Max : 26729 (-1.77 dB) File : master/06.wav Signal Max : 20980 (-3.87 dB) File : master/07.wav Signal Max : 29205 (-1.00 dB) File : master/08.wav Signal Max : 17139 (-5.63 dB) File : master/09.wav Signal Max : 27442 (-1.54 dB)All of them are within acceptable range, and the volume is perceived to be sensible acroll the tracks during playback. The perceived volume depends on the dynamic range of the audio - along with the equipment and the listener self as well.
Burn to CD
Since you're already on the command line, on Linux you can use cdrecord to burn the CD.
$ cdrecord -v speed=1 dev=0,0,0 -dao -audio master/*.wav