# Soundbanks and in-memory sounds Most short sound effects (footsteps, foley, combat, weapons, objects, UI, grunts) are **not in the WADs**: they are WEMs stored inside Wwise soundbanks, either loose in `SFX\*.bnk` or embedded in the UE3 packages (`.upk`). The catalog and the editor only cover the WADs (`wad.md`), so none of these sounds are listed or editable yet. Survey of the installed game (buildid 3718300) on 2026-10-09, read-only. ## Inventory | where | banks | unique in-memory WEMs | in the catalog | |-------|-------|-----------------------|----------------| | loose `SFX\*.bnk` (Batman/Catwoman footsteps, 32 surfaces each, + `TST_Prep_Media`) | 65 | 1,117 | 0 | | banks embedded in `.upk` packages (in 1,432 of the 2,650 packages) | 3,340 | 15,641 (~276 MB) | 0 | The two sets share 119 media IDs: 15,800 unique media IDs in 96,011 places (bank copies). 396 of them are **prefetch heads** of streamed WAD sounds (below), so there are **15,404 in-memory sounds**. All copies of a media ID are byte-identical except `1C898731` (two variants). The WADs, by comparison, are fully covered: the BKPK tables in the packages reference 2,543 WAD entries, all of them in the catalog. Embedded WEMs by bank name prefix: `Speech` 7,872, `CHR` (character foley, combat, bosses) 3,896, `PSO` 781, `WPN` 664, `NPC` 475, `OBJ` 439, `SEQ` 265, `GUI` 208, `PSA` 203, `MTN` 196, `PX` 195, `DVC` 100, `GEN` 80, `PHY` 73, `AMB` 65, `SBJ` 50, others < 30. The `Speech_` banks (e.g. `Speech_EMOTE_Batman`, `..._GRUNT`) are probably efforts/grunts rather than dialogue (there are no per-language packages); not verified by listening. All WEMs seen are Vorbis (format tag 0xFFFF), the same codec as the WADs: the footsteps are mono (4 stereo), the embedded ones mono or stereo (~22 % stereo in a 2,533-WEM sample). ## Names - The community hash list names none of these media IDs; only the bank names are known. - `CookedPCConsole\CookedBanks.txt` lists all 3,345 cooked bank names. Bank ID = FNV-1 32 of the lowercased name (the same hash Wwise uses for every name). 3,338 of them are embedded in packages, 4 are loose `.bnk` files (`Init`, `Global`, `Music`, `Music_PDLC`); `AMB_OW_A6`, `AMB_OW_C1`, `AMB_OW_E1`, `Speech_EMOTE_Thug_Muffled_Stop` and `Speech_GFxUI_ArkhamCityStories` were found nowhere. - Loose footstep banks are named in their STID chunk (`CHR_BatmanFootsteps_Concrete_Media`, ...). ## Bank layout (version 56, Wwise 2011.1) Chunks `BKHD` {u32 version 56, u32 bank id, ...}, `DIDX` N x {u32 media id, u32 offset, u32 size} (offsets relative to the `DATA` payload, WEMs 16-byte aligned), `DATA`, `HIRC`, `STID` {u32 type, u32 count, count x {u32 bank id, u8 len, name}}. `Init` (`50C63A23.bnk`) has `STMG`/`ENVS` instead of media. `701C1363.bnk` holds only `BKHD`. HIRC Sound object (type 2) payload: u32 object id, u32 plugin id (`0x00040001` = Vorbis), u32 stream type (0 = in memory, 1 = streamed, 2 = prefetch), u32 media id, u32 bank id of the media; for in-memory sources then u32 offset, u32 size, where offset = `DATA` payload position (from the start of the bank) + DIDX offset and size = DIDX size (checked on every in-memory source of the footstep banks and of `BmGame.upk`). Source kinds over all bank copies: 115,861 in-memory sources of the bank's own media; 2,233 in-memory sources with bank id 0 whose media is not in the same bank (loaded by another bank); 133,075 streamed sources; 2,101 **prefetch** sources. Every streamed or prefetched media ID is in a BKPK table, i.e. a WAD sound (`wad.md`). A prefetch source's media is also in the bank's DIDX: that in-memory copy is the **head** of the streamed WEM (its size = the source's size), which the game plays while the rest is read from the WAD. 396 WAD sounds have such heads (2,101 copies); replacing one of them must rewrite the heads too. ## Banks inside packages - The packages are LZO-compressed UE3 packages (`upk.md`); ackit decompresses them itself and searches the uncompressed data for `BKHD` (banks) and `BKPK` (WAD indexes). (The first survey used Gildor's decompress.exe; `ackit/upk.py` gives identical data.) - Bank blobs in packages: 41,798 for 3,340 bank IDs. Many banks are copied into several packages (e.g. `CHR_CatwomanFoleySuit` 31 times, `CHR_BatmanFoleyBelt` 26). 302 bank IDs occur as several blobs with *different* media subsets (often one WEM each, several per package), so a bank's media set is the union of all its blobs. - Largest: `CHR_RobinFoleyCape` 300 WEMs, `CHR_BatmanFoleyCape` 282, `CHR_Clayface` 263, `CHR_NightwingFoley` 242, `CHR_CatwomanFoleySuit` 225, `CHR_MrFreeze` 176, `CHR_Combat` 166. ## Consequences for editing (not implemented) - **Loose banks**: a replacement means rebuilding `DATA`/`DIDX` and the in-memory offsets/sizes in the HIRC Sound objects of that bank (and in any other bank whose sources use its media). Whether the game accepts a bank that changed size is untested. - **Embedded banks**: the package must be rewritten (decompress, patch every blob of the bank, recompress LZO, fix the package's chunk table and export offsets/sizes). A sound must be replaced in **every** package that carries a copy, otherwise the game may load the original from another package. - Either way: unverified in game so far; the same WEM rules apply (`wem.md`).