XACT XWB XSB XGS Audio
General Info
XACT is Microsoft Cross-Platform Audio Creation Tool shared first with Xbox SDK and then with DirectX SDK. It uses XAP file format (XACT project file).
The .xap files are processed at compile-time by the XACT program to xwb, xsb and xgs files:
XWB = XACT Wave Bank - a file format containing a collection of waves. Waves are the raw wave data in wav, aiff or xma format.
XSB = XACT Sound Bank - a collection of sounds and cues.
XGS = XACT General Settings - defines rules and settings for sounds.
The original release of XACT was in 2002 and shipped as part of the Xbox SDK only and was originally called the "Xbox Audio Creation Tool".
Later it was modified to work with Microsoft Windows.
XWB
- Format Type : Audio
- Endian Order : Little Endian / Big Endian
- Signature : WBND / DNBW
XWB Format Specifications
// XWB file format // Based on XWBTool source code (March 2022) // Compatible with XACT from DirectX SDK (June 2010) //header { 4 bytes (char) - signature // "WBND" or "DNBW" 4 bytes (uint32) - tool version (dwVersion / XACT_CONTENT_VERSION) // e.g. 46 for DirectX SDK (June 2010) 4 bytes (uint32) - file format version (dwHeaderVersion) // e.g. 44 // segments list (segment lookup table) // 5 segments in total for version 46/44 num_of_segments * { 4 bytes (uint32) - region offset 4 bytes (uint32) - region length } } // segment1 - bank data { 4 bytes (uint32) - bank flags (dwFlags) // FLAGS_ENTRYNAMES = 0x00010000 // FLAGS_COMPACT = 0x00020000 // FLAGS_SYNC_DISABLED = 0x00040000 // FLAGS_SEEKTABLES = 0x00080000 // FLAGS_MASK = 0x000F0000 4 bytes (uint32) - number of entries in the bank (dwEntryCount) 64 bytes (char) - bank name (szBankName) // e.g. "PinkPanther60", it's generated from wav name 4 bytes (uint32) - size of each entry meta-data element, in bytes (dwEntryMetaDataElementSize) // e.g. 4 4 bytes (uint32) - size of each entry name element, in bytes (dwEntryNameElementSize) // e.g. 0 or 64 4 bytes (uint32) - entry alignment, in bytes (dwAlignment) // e.g. 4 // format data for compact bank (MINIWAVEFORMAT) 4 bytes (uint32) - dwValue // 2 bits - format tag // 3 bits - channel count (1 - 6) // 18 bits - sampling rate // 8 bits - block alignment // 1 bit - bits per sample // build timestamp 4 bytes (uint32) - dwLowDateTime 4 bytes (uint32) - dwHighDateTime } // segment2 - entry metadata { num_of_wav_files * { if entry = ENTRYCOMPACT: { 4 bytes (uint32) - entry meta-data element // 21 bits - dwOffset (data offset) // 11 bits - dwLengthDeviation (data length deviation) } else: { x bytes - entry meta-data element } } } // segment3 - seek tables // This segment is not used for PCM Audio // But it's used by any other audio type supported by XWB file format { x bytes - seek tables data } // segment4 - entry names // This segment is skipped if flag OPT_FRIENDLY_NAMES is not set in XWBTool // Flag is set when "-f" option is passed to XWBTool, // this is equivalent to checking "Friendly names" checkbox in XACT { num_of_entries * { 64 bytes (char) - entry name + padding // e.g. "PinkPanther60" } } // segment5 - wave data // Basically each entry is WAV file without RIFF header { num_of_wav_files * { x bytes - wave data } }
XWB Format Specifications (older version from XBOX SDK)
// ARCHIVE HEADER
- char {4} - Signature (WBND)
- uint32 {4} - Tool Version (1, 2 or 3)
// DIRECTORIES
// Strictly speaking you can seek past this section, it (always?) refers to 4 directories
- // DIR 1 - WAVE BANK INFO
- uint32 {4} - Offset
- uint32 {4} - Length
- // DIR 2 - FILE RECORDS
- uint32 {4} - Offset
- uint32 {4} - Length
- // DIR 3 - ALWAYS EMPTY?
- uint32 {4} - Offset
- uint32 {4} - Length
- // DIR 4 - FILE DATA
- uint32 {4} - Offset
- uint32 {4} - Length
// DIR 1 - WAVE BANK INFO
- uint32 {4} - Flags
- uint32 {4} - Number of files
- byte {16} - Wavebank name (Padded with 0's)
- uint32 {4} - Size of each file record (in dir 2)
- uint32 {4} - Size of each entry name block
- uint32 {4} - Offset of file data
- uint32 {4} - Always null?
// DIR 2 - FILE RECORDS
- // FOR EACH FILE
- uint16 {2} - Number of channels
- uint16 {2} - Format tag (0=normal pcm) (1=xbox adpcm)
- uint32 {4} - Magic value
- uint32 {4} - File offset (Relative to start of DIR 4)
- uint32 {4} - File size
- uint32 {4} - Loop region offset (not sure what this does)
- uint32 {4} - Loop region length (not sure what this does)
Notes and Comments
XWB files (XACT Wavebanks) contain the audio data and are used in some XBOX and PC games.
XWB files contain following types of audio:
- PCM - Standard Wave PCM
- Xbox ADPCM - As used by many Xbox games
- AIFF
- WMA
- xWMA
- XMA
The PCM audio can be played easily, to play the Xbox ADPCM however you either need to pass it through a decoder (there's one in Psychonauts Explorer) or install the Xbox ADPCM codec.
The Wavebank may not contain any file names. This is because these may be stored in a seperate file - the SoundBank file (.xsb).
XWB audio files may occur along with XNB Archives.
XGS
- Format Type : Misc
- Endian Order : Little Endian / Big Endian
- Signature : XGSF / FSGX
XGS Format Specifications
// Based on XGS file created by XACT from DirectX SDK (June 2010) // header 4 bytes (char) - signature // "XGSF" or "FSGX" 2 bytes (uint16) - tool version // e.g. 46 2 bytes (uint16) - file format version // e.g. 42 // info 2 bytes (uint16) - CRC? 4 bytes (uint32) - last modification date (low value) 4 bytes (uint32) - last modification date (high value) 1 byte (uint8) - platform? // 3 - PC // 7 - XBOX 2 bytes (uint16) - number of categories 2 bytes (uint16) - number of variables 2 bytes (uint16) - unknown // 16 2 bytes (uint16) - unknown // 16 2 bytes (uint16) - number of run-time parameter controls 2 bytes (uint16) - number of DSP presets 2 bytes (uint16) - number of DSP params 4 bytes (uint32) - categories offset 4 bytes (uint32) - variables offset 4 bytes (uint32) - unknown offset // points to "1" 4 bytes (uint32) - category name index offset 4 bytes (uint32) - unknown offset // points to "2" and "3" 4 bytes (uint32) - variable name index offset 4 bytes (uint32) - category names offset 4 bytes (uint32) - variable names offset 4 bytes (uint32) - RPC offset // "FF FF FF FF" if there are no RPCs 4 bytes (uint32) - DSP presets offset // "FF FF FF FF" if there are no DSP presets 4 bytes (uint32) - DSP params offset // "FF FF FF FF" if there are no DSP params // data x bytes - categories x bytes - variables x bytes - categories names x bytes - variable names
XSB
- Format Type : Misc
- Endian Order : Little Endian / Big Endian
- Signature : SDBK / KBDS
XSB Format Specifications
// Based on XSB file created by XACT from DirectX SDK (June 2010) // header 4 bytes (char) - signature // "SDBK" or "KBDS" 2 bytes (uint16) - tool version // e.g. 46 2 bytes (uint16) - file format version // e.g. 43 // info 2 bytes (uint16) - CRC (FCS16 checksum) 4 bytes (uint32) - last modification date (low value) 4 bytes (uint32) - last modification date (high value) 1 byte (uint8) - platform?? // 0 - PC // 2 - XBOX 2 bytes (uint16) - number of simple cues 2 bytes (uint16) - number of complex cues 2 bytes (uint16) - unknown 2 bytes (uint16) - total number of cues 1 byte (uin8) - number of wavebanks 2 bytes (uint16) - number of sounds 4 bytes (uint32) - cue name table size // TODO
Notes and Comments
XBox Soundbanks contain the file names for the files in their corresponding Wavebank, along with other, unknown data.
The name of the SoundBank corresponds to the WaveBank usually, eg ASMusic.xwb and ASMusic.xsb. If in doubt though, the SoundBank referrs to its WaveBank internally, so you can check.
Some WaveBanks do not have a corresponding SoundBank.
XAP
- Format Type : Misc
- Endian Order : Little Endian
- Signature : XACT3
Example
// Example project file created by XACT from DirectX SDK (June 2010) Signature = XACT3; Version = 18; Content Version = 46; Release = June 2010; Options { Verbose Report = 0; Generate C/C++ Headers = 1; } Global Settings { Xbox File = Xbox\2010 June_NEW.xgs; Windows File = Win\2010 June_NEW.xgs; Header File = 2010 June_NEW.h; Exclude Category Names = 0; Exclude Variable Names = 0; Last Modified Low = 3822374669; Last Modified High = 30954062; Category { Name = Global; Public = 1; Background Music = 0; Volume = 0; Category Entry { } Instance Limit { Max Instances = 255; Behavior = 0; Crossfade { Fade In = 0; Fade Out = 0; Crossfade Type = 0; } } } ...
SDK Compatibility Table
XACT program was shared with Xbox SDK from 2002 to 2005.
Then it was shared with DirectX SDK from 2006 to 2010.
Below table represents version compatibility for each SDK version.
Whole list of different DirectX SDK executables can be found on web archive.
SDK Version | XWB Tool Version | XWB File Format Version | Example Games Using This SDK |
---|---|---|---|
Xbox SDK (unknown) | 1 | n/a | unknown |
Xbox SDK (unknown) | 2 | n/a | Brute Force (Xbox) |
Xbox SDK v5849.15 | 3 | n/a | Jumper: Griffin's Story (X360) ObsCure (XBOX) |
Xbox SDK (unknown) | 34 | n/a | Ninety-Nine Nights (X360) |
2006, April | 38 | n/a | unknown |
2006, June | 39 | n/a | unknown |
2006, August | 40 | n/a | unknown |
2006, December 2007, February 2007, April |
42 | 42 | unknown |
2007, August | 43 | 42 | unknown |
2008, March 2008, August |
44 | 42 | Bully: Scholarship Edition v1.2 (PC) Saints Row 2 |
2009, March | 45 | 43 | The Secret of Monkey Island: Special Edition v1.0 (PC) |
2009, August 2010, February 2010, June |
46 | 44 | BlazBlue: Chronophantasma Extend (PC) Bleed v1.7.0 (PC) Nitroplus Blasterz (PC) Skulls of the Shogun Terraria (X360) TowerFall Ascension (PC) |
Other Info
quickBMS Script
Not written yet.
Compatible Programs
- EkszBox-ABX
- foobar2000 + vgmstream plugin (+ source code)
- Game Extractor
- MonoGame.Framework
- Psychonauts Explorer
- QuickWaveBank (+ source code)
- towav
- unxwb (supports version 46/44 and maybe others)
- Example extraction: "unxwb.exe file1.xwb"
- xactxtract (supports only version 45/43)
- xact360extract
- XACT (Xbox Audio Creation Tool)
- DirectX SDK default location: C:\Program Files (x86)\Microsoft DirectX SDK (<version>)\Utilities\bin\x86\Xact3.exe
- XBOX SDK default location: C:\Program Files (x86)\Microsoft Xbox SDK\xbox\bin\xact.exe
Games
These games use this file format
- 007 Goldeneye (X360) (*.XWB / *.XGS / *.XSB)
- Alan Wake (Bonus Disc)
- Bard's Tale (PC)
- BlazBlue: Chronophantasma Extend (PC) (*.XWB / *.XSB)
- Blazing Angels: Squadrons of WWII (PC)
- Bleed (PC) (*.XWB / *.XGS / *.XSB)
- Brute Force (Xbox) (*.XWB / *.XSB) (version 2)
- Bully: Scholarship Edition
- Call of Juarez: Bound in Blood (PS3)
- Call of Juarez: Gunslinger
- Crackdown 1 (X360) (*.XWB)
- Conker: Live & Reloaded (Xbox)
- Darkwatch (XBox) *.xwb
- Drakensang
- Enchanted Arms (X360)
- Full Spectrum Warrior *.xwb
- Full Spectrum Warrior: Ten Hammers (PC) *.xwb
- Ghost Recon 2 (XBox) *.xwb
- Gray Matter (*.XWB / *.XSB)
- I Maed A Gam3 W1th Z0mb1es 1n It!!!1
- Jumper: Griffin's Story (X360) (*.XWB / *.XSB) (version 3)
- Just Cause (X360) (*.XWB / *.XSB)
- Kameo: Elements of Power (X360)
- Kung Fu Strike
- Magicka
- Minecraft
- Ms. Splosion Man (X360)
- Ninja Blade (X360)
- Nitroplus Blasterz (PC) (no-extension)
- Operation Darkness (X360)
- Perfect Dark Zero (X360) (*.XWB)
- Powerdrome (PC) *.xwb
- Psychonauts *.xwb
- Return To Castle Wolfenstein: Tide Of War (XBox) *.xwb
- Saint Row 2
- SBK 08 Superbike World Championship (PC)
- Skulls of the Shogun
- Star Trek Shattered Universe (XBox) *.xwb
- Sudeki (PC) *.xwb
- Supreme Commander (PC)
- Terraria
- The Misadventures of P.B. Winterbottom
- The Secret of Monkey Island: Special Edition (PC) (*.XWB / *.XGS / *.XSB)
- Trials HD (Xbox) *.xwb
- Top Spin 2 (PC)
- TowerFall Ascension (PC) (*.XWB / *.XGS / *.XSB)
- Two Worlds (PC)
- Unreal Championship 2 (XBox) *.xwb
- Unreal Championship 2: The Liandri Conflict (XBox) *.xwb
- Worms Reloaded (*.XWB / *.XGS / *.XSB)
- Xblaze Code: Embryo
- Yager (PC)
See Also
- Cross-platform Audio Creation Tool (wikipedia)
- monoxna - XnaFrameworkAudio.wiki
- XACT description (multimedia.cx)
- XACT.pdf
- XNB Archives (xentax wiki)
- XWB file format (PsychonautsExplorer)
- Tutorial for Export/Import XWB version 44/42 (forum.xentax.com)
Gallery