Making of Tron: Legacy – Audio Awesome mix

May 19th, 2011

This is an outline of how I produced my Tron: Legacy Audio Awesome Soundtrack mix, which you can read more about and download here.

A warning: This post is quite long, and has a fair bit of detail. I wanted to put this info out there, but haven’t spent a huge amount of time tidying it up or making it digestible. Ask questions in the comments if you’d like more info or clarification.

I’ve included some detail on specific tracks I’m particularly pleased with.

Tools

I mostly used open source tools, except Garage Band, which I used the most. I was working on a Mac.

Process

Througout the process, I used uncompressed audio, to avoid the repeat-processing causing quality loss. I compressed the final tracks to MP3 for distribution, using iTunes.

The whole thing took about 4 weeks to produce. I created 4 edits in that time, which I listened to over and over, making notes about poor sections or sloppy edits. I tried to make sure the sound effects complemented the music, rather than distracted from the music.

Big thanks to William and Andy – two friends that were critical enough to help me improve the final product.

Getting the audio

I extracted the audio from a video file of the movie using VLC, and saving as a WAV. The resulting WAV contained all 6 channels of the 5.1 surround sound audio. This was key to having a good selection of source audio to mix between.

I used sox to identify which track was which, using its remix function. For example, the following command plays just track 1 of tron.wav to both left and right speakers.

sox tron.wav -d remix 1,1

Here’s how the channels came out. I expect this is pretty standard.

  1. Front-left
  2. Frent-right
  3. Centre
  4. LFE (i.e. subwoofer)
  5. Rear-left
  6. Rear-right

I produced 2 stereo down-mixes. One had all channels, mixed Dolby Pro Logic style. The second was the same, but missing the centre track. The result is the second track has almost no dialogue audio, but all the music and most sound effects. Here’s a copy of my script I used to do that (which uses SoX). The script also produces rear-only and front-only downmixes, but I didn’t need them in the end.

echo "Downmixes 5.1 audio to stereo"
eche "  (reduces volume to avoid clipping)"
# Get output filename base.
out_name=`echo $2 | sed 's/\(.*\)\..*/\1/'`
out_ext=`echo $2 | sed 's/.*\.\(.*\)/\1/'`
if [ "$out_ext" = "$2" ]
then
  out_ext="wav"
fi
echo "Reading $1"
echo "Outputting to $out_name.$out_ext"
if [ "$1" = "$out_name.$out_ext" ]
then
  echo "Failure! Output and input are same file."
  exit
fi

if [ -z "$1" ] || \
   [ -z "$2" ] || \
   [ -z "$out_name" ] || \
   [ -z "$out_ext" ]
then
  echo "Usage: $0 in-file out-file (multi)"
  exit
fi

# Expected channels:
#  1 - Left
#  2 - Right
#  3 - Centre
#  4 - LFE (bass)
#  5 - Left rear
#  6 - Right rear

# Full stereo downmix:
#  Left channel  - 
#     Left  + 0.7*centre + 0.57*(0.7*LR + 0.7*RR) + 0.7*LFE
#  Right channel -
#     Right + 0.7*centre - 0.57*(0.7*LR + 0.7*RR) + 0.7*LFE
sox -S --ignore-length "$1" "$2" vol 0.5 \
        remix 1,3v0.7,5v0.4,6v0.4,4v0.7  \
              2,3v0.7,5v-0.4,6v-0.4,4v0.7
if [ "$3" = "multi" ]
then
  # Front (no centre) w/LFE
  sox -S --ignore-length "$1" "${out_name}-front.${out_ext}" \
          vol 0.5 remix 1,4v0.7 2,4v0.7

  # Rear (mixed same as downmix (so 'mono', but anti-phased
  # in left/right)) with LFE
  sox -S --ignore-length "$1" "${out_name}-rear.${out_ext}" \
          vol 0.5 remix 5v0.4,6v0.4,4v0.7 5v-0.4,6v-0.4,4v0.7

  # All minus centre
  sox -S --ignore-length "$1" \
          "${out_name}-nocentre.${out_ext}" \
          vol 0.5 remix 1,5v0.4,6v0.4,4v0.7 \
                        2,5v-0.4,6v-0.4,4v0.7

fi

Placing the music

I created a new movie soundtrack project in Garage Band, with Tron: Legacy as the movie. I worked through the film, placing the OST tracks in place as best as I could. Some of them (like Armory) just slot right in. Others needed chopping up. Others simply didn’t match the music in the film.

Garage Band project

Most of the time it was a case of lining the tracks up. I’d listen to the OST in the left ear, and the movie audio in the right ear to make sure they sounded aligned, and to be able to tell which was coming in early. Then I’d put them together and make sure there was no smushiness coming from a slight misalignment.

Some tracks don’t get played all the way through, like Adagio for Tron, which has a pause half way through. Others needed to be faded out. You can see the Track Volume control in the screenshot above. I used this to control the volume of tracks over time.

Reflections was slightly challenging. It gets played when C.L.U. is in Kevin Flynn’s home. It has a much longer introduction in the film. The first note plays continuously, building up, for over 30 seconds. I tried using the looping feature of Garage Band, but the loop start/stop was very noticeable. I found there’s a feature that lets you stretch and manipulate the audio. It’s intended for when one of your instrument tracks hits a note just off beat. You can push it into place. I used it to stretch the 10 second intro on the OST to the 30 second intro in the film. If you listen really carefully, I think it sounds a bit ‘digitised’, like it’s over-compressed. But it worked pretty effectively.

Manipulating Reflections

From this project, I exported an audio track that contains just the music, lined up with the film. This version doesn’t sound great. There are too many harsh edits, and some tracks don’t line up that well with the movie. (Hint: by hiding the movie track, you get the option to export the audio to disk.)

I went back to this project frequently to tweak the syncing or to add tracks I identified later. It was trivial to re-export the audio and drop it in to the next project.

Making my mix

I created a second Garage Band Movie Soundtrack project to create the Tron: Legacy Audio Awesome mix.

This product had each of my source audio tracks.

  • Downmixed stereo film audio
  • Downmixed stereo film audio without dialogue
  • OST track, exported from the previous project

This project is ‘simply’ a mix (using the gain curves) between the different sources.

Audio Awesome Garage Band project

I mostly went for OST only, but added in the movie audio track when the sound effects are complementary to the music. When there were sounds I wanted, but also dialogue I didn’t want, I used the no-centre track. For tracks that I didn’t have OST for, I had to rely on the no-centre movie audio.

Some tracks sounded quite different in the film. Much of the arena sequence (Arena, Round One and Rinzler) are quite echoey in the movie, and so I had to be more selective about mixing in movie audio, to keep crisp sounding music.

Derezzed was a difficult track. I wanted to enhance it with fighting noises, but the screams are distracting, and a lot of the fighting noise is organic, rather than electronic. I’m fairly happy with the balance I found, but it involved carefully mixing the film audio out for the worst bits, and making use of the no-centre mix, which softened the harsh screams and thuds. I also tweaked the music volume in places to account for the increased volume of the music and sounds from the movie audio.

Mixing Derezzed

The cleverist bit was in C.L.U., where there’s a short extra section of music (when Rinzler loops over the three goodies). I wanted to keep that piece of music, and also have some movie audio (and even dialogue for that section – I decided to keep a few bits of dialogue). It took some fiddling of mixes between the OST, no-centre audio and full film audio to make the music able to cut out for the section I didn’t have, but for the no-centre audio to boost the music in the film audio to make the whole transition seamless.

Mixing C.L.U.

Productizing

From that project, I exported a single audio file, the same length as the movie with silence when there was no music or audio I wanted. I split the long track in to individual tracks, based on silence (thus removing the long stretches of silence). I also normalised the tracks to reduce the amount of very quiet audio (e.g. when Quorra is helping Sam).

I wanted to use audacity for this process, and then to be able to adjust the volume very flexibly, and to split tracks that don’t have silence between them. However, this meant re-doing the process everytime I wanted to make a tweak to an early part (e.g. re-sync a track).

I found that I could do pretty much everything I wanted using SoX, and the big advantage was that I could write a sequence of scripts to re-do the productization when I produced a tweaked edit.

Sadly, I didn’t manage to get it to work with the Lame MP3 encoder, so always had to import to iTunes to manually label and encode to MP3.

Here’s the scripts I used with SoX. It starts by doing a fairly careful split on silence to get the individual tracks. Then subscripts are called to do the edits to each track that needs edits. The subscripts do fairly basic things, like the following.

  • Trimming silence from the end of TVs (so there’s no gap before the start of Son of Flynn.)
  • Adding extra silence to give more breathing space between Encom Part 2 and Flynn Lives.
  • Splitting some tracks more aggressively, where there are shorter (but present) silences. (The main silence-splitter couldn’t be too aggressive, because it split on small silences in Adagio For TRON.)

sox-execute-all.sh

if [ -z "$1" ]
then
  echo "USAGE: $0 in-file"
  echo
  echo "Supply the path to the full-length uncut "
  echo "Tron Legacy Audio Awesome exported audio."
  echo "The current directory is used for working space."
  echo "The audio track will be split into its tracks, "
  echo "adjusted, and output to a 'done' folder in "
  echo "the current directory."
  exit
fi

# Split single input track in to multiple tracks. 
# Make sure we get the number of tracks we were expecting.
sox-remove-silence $1 tron.aif split

if [ `find . -name "tron[0-9][0-9][0-9].aif" \
             -maxdepth 1 | wc -l` \
     -ne 29 ]
then
  echo "Unexpected number of tracks"
  exit
fi

echo "Apply pre-normalisation fixes"
./sox-edit-TVs.sh tron002.aif
rm tron002.aif

./sox-edit-encom2.sh tron004.aif
rm tron004.aif

./sox-edit-flynnsclub.sh tron006.aif
rm tron006.aif

./sox-edit-arrival.sh tron027.aif
rm tron027.aif

./sox-edit-ending.sh tron028.aif
rm tron028.aif

# Normalise all tracks.
./sox-edit-normalise.sh

echo "Attenuate loud tracks"
echo
echo "Attenuating rinzler tracking by 6dB"
sox -S normalised/tron020.aif \
       normalised/tron020-soxed.aif vol -6dB
rm normalised/tron020.aif

echo "Attenuating Sam with sim card by 6dB"
sox -S normalised/tron027-soxed002.aif \
       normalised/tron027-soxed002-soxed.aif vol -6dB
rm normalised/tron027-soxed002.aif

echo "Attenuating ending sunrise prelude by 6dB"
sox -S normalised/tron028-soxed001.aif \
       normalised/tron028-soxed001-soxed.aif vol -6dB
rm normalised/tron028-soxed001.aif

# Move the output directory to mark the
# process as complete.
mv normalised done

sox-remove-silence

echo "Reduces silent sections to 2s long."
echo "Usage: $0 in-file out-file (split)"
if [ "$3" = "split" ]
then
    echo "splitting..."
    sox -S "$1" -p silence 1 0.50 0.1% 1 10:00 0.1% | \
    sox -p "$2" silence -l 1 0.50 0.01% 1 3.0 0.01% : \
    newfile : restart
else
    echo "reducing..."
    sox -S "$1" "$2" silence -l 1 0.3 0.1% -1 2.0 0.1%
fi

sox-edit-TVs

echo "Set of edits for TVs track"
if [ -z "$1" ]
then
  inname="tron002.aif"
else
  inname="$1"
fi

ext=`get-extension $inname`
name=`get-name $inname`
outname="$name-soxed.$ext"

echo "Input track name $inname"
echo "Output track name $outname"

echo "Removing silence from the end."
sox -S "$inname" "$outname" silence 0 1 1.7 0.1%

sox-edit-encom2.sh

echo "Set of edits for Encom Part 2 track"
if [ -z "$1" ]
then
  inname="tron004.aif"
else
  inname="$1"
fi

ext=`get-extension $inname`
name=`get-name $inname`
outname="$name-soxed.$ext"

echo "Input track name $inname"
echo "Output track name $outname"

echo "Adding extra silence at the end."
sox -S "$inname" "$outname" pad 0 2.0

sox-edit-flynnsclub.sh

echo "Set of edits for end credits track"
if [ -z "$1" ]
then
  "USAGE: $0 in-track"
  exit
else
  inname="$1"
fi

ext=`get-extension $inname`
name=`get-name $inname`
outname="$name-soxed.$ext"

echo "Input track name $inname"
echo "Output track name $outname"

echo "Split more aggressively."
sox -S "$inname" -p silence 1 0.50 0.1% 1 10:00 0.1% | \
  sox -p "$outname" silence -l 1 0.50 0.1% 1 2.0 0.1% : \
  newfile : restart

sox-edit-arrival.sh

echo "Set of edits for arrival, clu, leaving grid, father&son"
if [ -z "$1" ]
then
  "USAGE: $0 in-track"
  exit
else
  inname="$1"
fi

ext=`get-extension $inname`
name=`get-name $inname`
outname="$name-soxed.$ext"

echo "Input track name $inname"
echo "Output track name $outname"

echo "Split more aggressively."
sox -S "$inname" -p silence 1 0.50 0.05% 1 10:00 0.05% | \
  sox -p "$outname" silence -l 1 0.50 0.05% 1 2.0 0.05% : \
  newfile : restart

sox-edit-ending.sh

echo "Set of edits for end credits track"
if [ -z "$1" ]
then
  inname="tron028.aif"
else
  inname="$1"
fi

ext=`get-extension $inname`
name=`get-name $inname`
outname="$name-soxed.$ext"

echo "Input track name $inname"
echo "Output track name $outname"

echo "Split more aggressively."
sox -S "$inname" -p silence 1 0.50 0.1% 1 10:00 0.1% | \
  sox -p "$outname" silence -l 1 0.50 0.1% 1 2.0 0.1% : \
  newfile : restart

The tracks are then normalised. For the most part, normalising worked well. Some tracks were too loud or harsh, so the master script then attenuates those tracks.

sox-edit-normalise.sh

echo "Normalise all tron tracks found."
mkdir normalised
for ff in `ls tron*aif`
do
  echo $ff
  sox -S $ff normalised/$ff gain -n
done

SoX output

I found that despite normalising, since some tracks have multiple ‘sections’, mixing from one to the next, individual sections were still too quiet. I went back to the second Garage Band project to tweak the volume within tracks, and checked carefully for clipping.

Leave a Reply