L4D Custom Music Tutorial
There are 7 steps to adding custom music to your campaign in Left 4 Dead:
- Create a text file called [your_exact_map_name]_level_sounds.txt in your addons maps directory.
- Copy ALL the contents from my example soundscript into that file.
- In the missions file of your addon, find the NAME parameter, and pick a short name that has no spaces.
- In notepad, press CTRL + H, to find and replace XXXXX with the same name you used in missions.txt NAME field.
- Begin replacing any wav files you choose in the script to reference your own files. (Do not include sounds/ in the paths, it's assumed)
- BSPZIP or Pakrat your custom music into the map .bsp file. (The paths for each wav file within the bsp should be sounds/music/your_custom_folder)
- Packadge your campaign into a VPK and test it out ingame, your custom music should work!

Custom Music Script File
This is the example soundscript you need to copy.
It is a stripped version of the game_sounds_music.txt to only include the Events you need to edit for your campaign. Using it fixes a bug with soundscripts where zombies would play an alarm sound when killed with fire, amongst other things. It is also highly commented allowing a greater insight into what each section is for when deciding on what to change.
You may also opt not to change anything in the file, which will give your campaign the default music cues associated with the Airport campaign.
http://www.evolvedant.com/soundscript/example_script.zip

Example Tips
If your campaign is called 'Awesome' and contains maps such as l4d_awesome_forest, l4d_awesome_campsite, etc... Your addons maps directory should contain l4d_awesome_forest_level_sounds.txt
The NAME parameter in your missions.txt would be 'awesome' and look like this:
A custom intro song that we will call 'thriller.wav' correctly pathed and added into the bsp would look like this:
Heres how your sound script would look properly edited to make use of thriller.wav
Major Drawbacks
Unfortunately you must include custom music wav files in EVERY bsp that is part of your campaign. This is due to technical issue with how sounds are handled in L4D that was introduced to the game a few weeks before release. The only way to go around this is to store your sound files in the VPK's sound directory and request that downloaders of your campaign run the console command snd_rebuildaudiocache. This is not optimal, as many players will never run the command, it takes 5 mins to run if they do, and it overwrites sound manifest files on their client.

The L4D SDK team is aware of both these sound issues, there is no ETA on when either technique will be fixed.
You must ALSO make a copy of the sound script file itself renamed to the same name of each of your bsp's in your campaign. As each map will reference only the script that has the same name as the map.
Custom soundscripts seem to only work when packadged completely as a VPK. Simply running off the addon folder isn't sufficient. This makes testing quick changes more cumbersome.