Introduction

Alien: Isolation's audio runs through Wwise. Scripts don't reference audio files — they fire sound events by name, and Wwise decides what that means: which take to play, whether to pick at random, which bank the audio comes from.

Whenever you set a sound event on an entity parameter, OpenCAGE opens the sound event selector. That window has a player along its bottom edge, so you can hear what an event actually sounds like before committing to it — and export or replace the audio behind it.

The same window opens from View → Sound Editor once a level is loaded, with no parameter behind it: every sound event the level knows (shown below), with the soundbanks each is in, to listen through, export or replace, without first finding an entity that plays one. The box along the top filters the list as you type, on the event's name or the name of a soundbank it's in. It stays open while you work in the editor and closes when the level does. Only one of these windows is open at a time, so editing a sound event parameter in the inspector closes the Sound Editor and opens the picker in its place.

The Sound Editor window: a searchable list of every sound event in the level and the soundbanks each is in, with the preview player along the bottom edge showing the loaded take, its variations and the Replace and Export buttons.

View → Sound Editor with an event selected. Opened from a parameter instead, the same window is titled Select for 'sound_event' and gains a Select button.

Events, Banks & Variations

Three ideas are worth having straight before you start changing things:

  • An event is the name a script fires. It is not a file.
  • A soundbank is the container the audio ships in. The same event can appear in several banks, because banks are loaded per level.
  • A variation is one of the actual takes behind an event. Most interesting events sit behind a random or switch container and pick between several takes at runtime — footsteps, impacts, and vocalisations especially.

The player exposes every variation it managed to resolve — below, the eight random takes behind play_facehugger_egg_opens — which is the only way to hear what an event will really sound like in the game rather than one arbitrary take of it.

The preview player with its variations dropdown open, listing the eight random takes behind the event.

Every take the event resolved to is listed; Shuffle picks one at random the way the game would.

The first time you open the selector, OpenCAGE starts indexing the game's soundbanks in the background so the first sound you click is ready rather than waiting on a cold index. While that runs the player's status line reads Indexing the game's soundbanks..., then Decoding... for each take.

Playing a Sound in a Script

Two entities do the work, and you generally need both:

  • Sound — plays a sound event. Set its sound_event parameter and trigger it; that parameter is what opens the selector described on this page.
  • SoundLoadBank — loads the soundbank the event lives in. The audio isn't resident until something loads its bank, so a Sound entity firing an event from an unloaded bank plays nothing.

Which bank to load is exactly what the Soundbanks column tells you — find the event, read off a soundbank it's listed in, and have a SoundLoadBank load it: link a VariableString holding the bank's name to the SoundLoadBank's sound_bank pin, the way the game's own scripts do. A name typed straight onto the pin isn't read. See Soundbank Metadata.

Banks that are permanently resident don't need loading; those are configured separately under Permanent Soundbanks.

Dialogue

Character dialogue is fired the same way — through sound events — but by entities that also know which character is speaking, so the line comes from the right place and drives the right face:

  • Speech — one line on one character. Takes a character to speak it (plus an alt_character), and like Sound it inherits its sound_event from SoundPlaybackBaseClass. speech_priority decides what it interrupts or is interrupted by, and queue_time is how long it will wait for a slot before giving up. Fires on_speech_started.
  • SpeechScript — a whole exchange. Takes up to five characters (character_01…character_05, each with an alt) and up to ten lines. Each line has a line_NN_event for the sound event, a line_NN_character naming which of the five slots delivers it, and — from the second line onwards — a line_NN_delay for the pause before it. Fires on_script_ended when the last line finishes.

Use Speech for a barked line or a one-off; use SpeechScript for back-and-forth conversation, where hand-wiring a chain of Speech entities and delays would be far more work.

In the selector, a dialogue event shows its subtitle in the Text column, and the search box matches on that text as well as on the event name — so you can find a line by what's said. Lines whose audio depends on who is speaking can't be previewed; the player's status line says so when you select one.

Both still need their bank loaded, so the Soundbanks column → SoundLoadBank step above applies to dialogue as much as to any other sound.

Previewing a Sound

Select an event in the list and the player fills in, as in the screenshots above. The top row is the transport; the row beneath is everything about the take that's loaded:

  • Play / Stop, with a seek bar you can scrub and the elapsed / total time. Play becomes Pause while the sound runs, and on a long sound a shaded portion of the bar shows how far decoding has got.
  • A status line naming the soundbank the event is declared in, with a count of the others (Mission_DLC_ChallengeMap4 +4 in the screenshots), the container path it resolved through — Random, Switch > Random and so on — its sample rate and channel layout, and the media id and the bank or package it lives in. It's cut short with an ellipsis when the window is narrow, as it is above; hover over it for the whole line, or widen the window. If an event resolves to no audio at all, this line says why instead — an event that only changes sound settings, say, or dynamic dialogue that depends on who is speaking.
  • Auto-play — start playing as soon as you select an event, so you can arrow through a list and hear each one
  • A variations dropdown listing every take behind the event — Variation 1 of 8 (Random) and so on. It only appears when there's more than one.
  • Shuffle — jump to a different variation at random, which is roughly what the game does (also only shown when there's more than one)
  • Replace and Export — see below. Replace (for every level, or for the open level only) is hidden for an event that resolved to no audio.

Audio is decoded on demand rather than up front, so a long sound may take a moment before it starts.

Exporting Audio

Export writes the variation currently selected out as a .wav, named after the event by default. The file is decoded from whatever the game stores it as, so you get plain uncompressed audio you can open anywhere: 16-bit PCM, with a 5.1 sound mixed down to stereo. A sound longer than five minutes is only decoded, played and exported up to that point, and the status line ends with first 5 minutes only.

Exporting waits for the decode to finish first, which for a long sound is a few seconds — the button greys out while it works.

Note that this exports one variation, not the whole event. If an event has eight footstep takes and you want all of them, export each in turn.

Replacing Audio

Replace swaps the audio behind the selected variation for a .wav of your own. OpenCAGE encodes it into exactly the form the game's decoder expects and writes it into the soundbanks that hold it — for every level, or for the open level alone (see Replacing for One Level).

Everything is checked before anything is written. If the audio can't be imported, you're told why and nothing changes — you won't be left with a half-edited soundbank. If it can, you get a summary first:

  • Mono or stereo, duration, and sample rate
  • What it was encoded to, and at what quality
  • How big the new audio is against the audio it replaces
  • Any notes worth knowing before you commit — how many copies of the audio the game ships and which banks hold them, whether the files holding it will grow, or a copy that couldn't be reached

The Replace confirmation dialog summarising the incoming audio, its encoding, its size against the original and how many copies the game ships, before asking whether to replace the sound.

The summary shown before a replacement is written. Nothing changes until you answer Yes.

Answer Yes and the replacement is applied; the variation is then reloaded into the player, so you can play the new audio straight back.

Preparing a WAV

Replacement audio must be a .wav. A few things to keep in mind:

  • Uncompressed, any channel count or sample rate. The .wav must be uncompressed PCM (8, 16, 24 or 32-bit) or floating point. The game's codebooks only cover mono and stereo, so a file with more channels is mixed down to stereo. A sample rate the game's decoder isn't set up for is resampled to the nearest one it is: mono works from 16000 Hz up, stereo from 32000 Hz up, and anything above 48000 Hz (the highest the game ships) comes down to 48000 Hz. The summary says when either happened.
  • Match the original's channel count where you can. Replacing a mono sound with a stereo file changes how the engine positions it in 3D space. The summary names the original's layout beside your file's; Import WAV in the Level Sound Override window can mix and resample to match it for you.
  • The encoding follows the original. On PC everything is Wwise Vorbis. The Switch build also stores some sounds as Wwise ADPCM and a few as plain PCM — OpenCAGE encodes to whichever codec the sound it's replacing used, so the game can still read it.
  • Size matters, but isn't fatal. The summary tells you how the new audio compares to the old; a much larger file grows the container it lives in.
  • A variation with no audio of its own can't be replaced. Some entries in a container are references rather than media — the player says so if you try.

Every Copy is Replaced

The same audio is often shipped in several banks at once, because banks are loaded per level and a sound used in three levels lives in three places.

A replacement therefore updates every copy the game ships, not just the one you were listening to — the summary says how many there are and names the banks, as in the dialog above. If it only changed one, the old sound would come back in whichever level loaded a different bank — which reads as a bug in the game rather than an unfinished edit.

If some copies write and others fail, OpenCAGE says so explicitly rather than reporting success, since a partial replacement leaves the sound changed in some places and not others.

Replacing for every level is global. The shared soundbanks aren't per-level data — For Every Level changes a sound everywhere in the game. To change it on one level only, use For This Level Only (below). Replacing isn't an undo step, so Edit → Undo won't bring the old sound back. OpenCAGE keeps a copy of each soundbank's original version the first time it changes it, for the Mod Manager, but take a backup before doing this at scale.

Replacing for One Level

Replace opens a menu asking where the new audio goes:

  • For This Level Only… — the audio goes into the open level's own sound package, WORLD\LEVEL_SOUND_OVERRIDE.PCK (made if the level has none yet). The game reads that package ahead of the shared sound files when it loads the level, so this level plays your audio and every other level keeps the original — see Level Sound Override. Greyed out, naming the soundbank, for a sound no level can replace (see What a Level Can't Replace).
  • For Every Level… — the audio is written into the game's shared sound files, as described above.
  • Use the Base Game's Audio on This Level — takes the selected variation back out of the level's package, so the level plays what the game ships for it. Only offered when the level's package holds that sound.

The summary before a level-only replacement says what will happen to the level's package: whether one is made, which soundbanks are copied into it, and how big it comes to. A streamed sound goes in on its own; a sound held inside a soundbank needs that whole bank in the package, so the bank is copied in once (a gun's own bank, such as PISTOL.BNK, is about 2 MB) and later replacements change the copy where it is. Of the per-level DynamicLoad_ soundbanks, only the level's own is copied: a sound is often in dozens of them, but a level only ever loads the one named for it. The shared files in DATA\SOUND are never touched.

A level that already has a package — the challenge maps and Salvage Mode levels ship one — is edited in place: a sound inside one of its own soundbanks is changed there, and everything else in it is left exactly as it was.

Level Sound Override

Any level can carry a sound package of its own: WORLD\LEVEL_SOUND_OVERRIDE.PCK in the level's folder. When the game loads the level it mounts that package ahead of the shared sound files, so a soundbank or a streamed sound in it with the same id as one in DATA\SOUND is read from the package instead — on that level alone. The challenge maps carry changed copies of shared soundbanks, soundbanks of their own and replacement streams this way.

It's how a modded map gets sounds of its own without changing the game's: replace a gun's firing sound for your level and every other level keeps the original.

The Level Sound Override… button at the bottom left of the Sound Editor lists what the open level's package holds — each soundbank, each sound changed inside it, and each stream, with its size and what it stands in for on this level. Everything is listed by name: a soundbank by its own name, and a sound by the sound event that plays it (Play_SPOT_2_Man_Switch_Console, or Play_Pistol_Fire (take 3 of 19) for one of several takes, with +2 more when other events play it too) rather than by the number its file is named for. The number is still in the File column, and stands in for the name only for audio none of the level's events plays — a soundbank of your own, say. The Search box filters the list by either.

The Level Sound Override window listing two soundbanks, each with the sound changed inside it indented beneath, and two streams, every one named by its sound event, with Import WAV, Add Files, Export, Remove and Close along the bottom.

A level's package with two sounds replaced inside copies of their soundbanks and two streams. The indented rows are the sounds that differ from the base game's copy of each soundbank.

  • Import WAV… — makes a sound for the level from a .wav, in place of one of the game's or as a stream of its own — see Importing a WAV. With a sound selected it starts on that sound; with a soundbank selected, on that soundbank's sounds. Double-clicking a row does the same.
  • New Soundbank… — makes a soundbank of the level's own, with sound events new to the game — see Making a Soundbank. With a soundbank made this way selected it reads Edit Soundbank…, to add events to it or take them out; double-clicking the soundbank does the same.
  • Add Files… — puts a soundbank (.bnk, built with the game's version of Wwise) or a stream (.wem named for its id, such as 123456789.wem) into the package as it is, in place of anything there with the same id.
  • Export… — saves the selected soundbank, stream or sound out of the package: a soundbank as a .bnk, a stream or a sound from inside a soundbank as Wwise audio (.wem) or, decoded, as a .wav.
  • Remove (or Delete) — takes the selected soundbanks and streams out of the package, so on this level the game reads the shared file of the same id again, and puts the base game's audio back in place of the selected sounds in soundbanks. A soundbank that ends up the same as the base game's comes out of the package, and a package with nothing left in it is deleted.

Every change is written straight away, so there's nothing to save — but none of them are undo steps, and the level's package is the only copy of anything changed in it. Replace → For This Level Only… in the Sound Editor writes to the same package.

The game holds the package open while it's running the level, so close the game before changing it.

Importing a WAV

Import WAV… turns a .wav into audio the game plays, with no Wwise needed: it's encoded the way the game's own audio is (Wwise Vorbis) and put where the game reads the sound from on this level.

The Import WAV window: the chosen .wav at the top, a searchable list of the game's sounds with the one it replaces selected, the channel, sample rate, quality and gain choices, and a summary of what importing it will do above Play Original, Play New, Import and Cancel.

A mono 22050 Hz .wav going in place of play_alien_spawn, mixed and resampled to the stereo 44100 Hz the original was shipped at.

  1. Browse… for the .wav, or drop one on the window. While no sound is picked yet, a file named for a sound event or a sound's id picks that sound for you.
  2. Pick the sound it replaces. The list has every sound the level's events play, named by the event (and which take it is), its id, where the game keeps it — a stream, or the soundbank it's in — and the other events that play it. Search by an event's name, a soundbank's name or an id. A sound the level can't replace says why in Kept in (see What a Level Can't Replace).
  3. Choose the layout. By default the new audio matches the sound it replaces: mixed to its channel count and resampled to its sample rate, so the game positions and mixes it as before. You can keep the .wav's own channels or rate instead, or pick mono, stereo or a rate yourself. Quality is the Vorbis quality (raised automatically to the nearest setting the game's decoder is set up for), Gain adds decibels, and Normalise to -1 dBFS scales the loudest moment to just under full scale.
  4. Read the summary: the new audio's layout against the original's, the encoding, its size against the audio it replaces, and what happens to the level's package. It's worked out again whenever you change something, and nothing is written yet.
  5. Play Original plays the game's audio for the sound; Play New plays the new audio, decoded from the very file that will go in. Import writes it.

Where it goes depends on where the game keeps the sound. A streamed sound goes in as a stream of its own. A sound held inside a soundbank needs the whole bank, so the bank is copied into the package once and the sound swapped inside the copy, with the bank's directory and the sound objects that point at the audio kept in step; later imports change the copy where it is. A streamed sound whose opening is also held in a soundbank (for it to start without waiting on the disk) gets both. Of the per-level DynamicLoad_ soundbanks, only the level's own is copied.

Add it as a stream of its own puts the audio in the package as a stream with an id you type — for a soundbank of your own, added with Add Files…, that streams audio by that id. There's no original to match, so the .wav's layout is kept unless you choose one.

A few things the summary will tell you about:

  • Surround. The game's codebooks only cover mono and stereo, so a 5.1 original gets stereo audio, and a surround .wav is mixed down.
  • Size. Audio held in a soundbank stays in memory for as long as the bank is loaded. A replacement several times the size of the original, or a large one, is pointed out; mono, a lower sample rate, a lower quality or a shorter sound make it smaller.
  • Loops and markers. Whether a sound loops is up to the game, which repeats the whole of the new audio where it loops the sound — unless the .wav has a loop region of its own (a smpl chunk, as most audio editors write one), which is carried over, so it plays through once and then repeats just that part, the way some of the game's music does. Markers (cue points) aren't carried; the summary says when the original had a loop region or markers.

Import WAV changes the audio behind sounds the game already has. For sound events of your own — names no soundbank of the game's declares — make a soundbank: see Making a Soundbank.

Making a Soundbank

New Soundbank… makes a soundbank of the level's own: sound events new to the game, each playing a .wav of yours and sounding like a sound of the game's you pick. No Wwise is needed. Scripts load it and play its events like the game's own.

The New Soundbank window: the soundbank's name, its three events with their .wav files, the sounds of the game's they sound like and whether they loop, and below them the fields to add another event - a name, a .wav, and a searchable list of the game's sounds to pick the one it sounds like - above a summary of how to load and play the bank.

A soundbank of three events, about to be created: one sounding like play_alien_spawn, one like a 3D sound of M04's, and one that loops.

  1. Name the soundbank: letters, digits and underscores, and not the name of one of the game's.
  2. Add each event: its name (what a Sound entity's sound_event will say — letters, digits and underscores, and not a name the game already uses), its .wav, and the sound of the game's it sounds like, picked from the same searchable list as Import WAV (Play Sound plays it). Tick Loop until stopped for a sound that repeats until something stops it. Then Add Event.
  3. Create. The .wav files are encoded the way the game's audio is, laid out like the sounds they sound like (channels and sample rate), and the soundbank goes in the level's sound package.

An event sounds like its sound of the game's: it plays through that sound's actor-mixer and output bus, with its 3D positioning and distance attenuation, reverb sends, volume, effects and game-parameter curves — everything the game's sound designers set up for it but the audio, and its random pitch or volume, which are left out so the .wav plays as it is. Pick a 2D sound (music, a radio, the UI) for audio heard the same wherever the player is, and a 3D one near the kind of thing yours is — a door, a voice, a machine — for audio that comes from where its Sound entity is and fades with distance.

The events also go in the level's sound event table (WORLD\SOUNDEVENTDATA.DAT) and the soundbank in its soundbank list: the game looks up the event a Sound entity names in that table as the level loads, and plays nothing for a name it doesn't find there. So they appear in the sound event selector and the Sound Editor straight away, in the soundbank's name, where they can be previewed like any other.

To play them in the level:

  • Add a SoundLoadBank to the level's script, with trigger_via_pin off to load the bank as the level loads, and link a VariableString holding the soundbank's name to its sound_bank pin.
  • Add a Sound entity per event, its sound_event set to the event's name and its position where the sound should come from, and trigger it (its start pin) like any other.
  • For an event that loops, leave the Sound entity's multi_trigger off, so its stop pin stops the sound: with multi_trigger on, each trigger plays on by itself and stop does nothing to it.

With the soundbank selected, Edit Soundbank… lists its events to add more or take some out (Remove Event), then Saves it again. Remove in the Level Sound Override window takes the whole soundbank out, and its events out of the level's sound event table with it.

The soundbank and its events belong to this level. They're in the level's own sound package and sound event table, so another level doesn't have them — make the soundbank there too. The audio is held in the soundbank, so it stays in memory for as long as the bank is loaded: keep long sounds short, mono, or at a lower sample rate. A sound of the game's whose 3D positioning follows a path, or that isn't Vorbis audio, can't be borrowed from; pick another.

What a Level Can't Replace

  • Sounds in a permanent soundbank. The soundbanks listed in Permanent Soundbanks — Weapons, Explosions, the foley and footstep banks and others — and Init and UI, which the game loads as it opens, are loaded once as the game starts and stay loaded, so they're in memory before any level's package is read. A level's copy of one is never used, and where the same audio is in a level's own soundbank as well, the game still plays the permanent bank's copy. A gun's firing sound is usually several takes, some in the gun's own soundbank (PISTOL.BNK, SHOTGUN.BNK…) and some in WEAPONS.BNK: the first can be replaced for one level, the second only for every level. The variations dropdown lets you step through the takes, and For This Level Only says which bank holds any it can't change.
  • Dialogue. Voiced lines are looked up by voice language, so they can only be replaced for every level.

Soundbank Metadata

The Soundbanks column beside each event lists every soundbank the event appears in, as the level's sound data declares it. The player's status line names one of them and counts the rest (Mission_DLC_ChallengeMap4 +4); the column is the full list. It tells you which levels can actually fire the event — one that isn't in a bank your level loads won't play, however correctly the script is wired. Searching for a soundbank's name lists the events in it, as below.

The Sound Editor filtered by a soundbank's name, M04_WelcomeToSevastopol, listing the events in that soundbank with each event's soundbanks in the second column.

The events in M04_WelcomeToSevastopol, found by typing its name in the search box. Any bank in an event's Soundbanks column is a valid target for a SoundLoadBank entity.

This is where you get the bank name to give a SoundLoadBank entity, so the event you're about to fire is actually loaded — see Playing a Sound in a Script.

Which banks are permanently resident is configured separately — see Permanent Soundbanks.