XACT
Jump to navigation
Jump to search
- Extensions: xwb, xsb, xgs
- Company: Microsoft
- Website: http://msdn.microsoft.com/en-us/library/bb174772.aspx
- Wikipedia article: https://en.wikipedia.org/wiki/Cross-platform_Audio_Creation_Tool
Cross-platform Audio Creation Tool (XACT) is a audio framework released as part of the DirectX SDK.
Distributed XACT projects consist of three file formats:
Wave Banks (.xwb)
A file format containing a collection of waves
Open source parsers:
Sound Banks (.xsb)
A collection of sounds and cues
- Sounds - a sound has one or more waves together with properties like volume and pitch. Sounds are made up of tracks.
- Tracks - tracks are made up of events E.g. the simplest track has a Play Wave event
- Events - various actions that take place within a track. Actions include: Play, Stop, Set Volume, Set Pitch etc.
- Cues - a cue is used in code to trigger sounds. Each cue is made up of one or more sounds
sturct SoundBank { struct SoundBankHeader header; struct WaveBankNameTableEntry[header.numWaveBanks] wavebankNames; struct SoundEntry[header.numSounds] sounds; struct SimpleCueEntry[header.numSimpleCues] simpleCues; struct ComplexCueEntry[header.numComplexCues] complexCues; //... } struct SoundBankHeader { uint32_t magic; // "SDBK" uint16_t toolVersion; // 0x2E uint16_t formatVersion; // 0x2B uint16_t crc; // fcs16 checksum of all following data uint32_t lastModifiedLow; uint32_t lastModifiedHigh; uint8_t platform; //0x12 ?? uint16_t numSimpleCues; //0x13 uint16_t numComplexCues; //0x15 uint16_t unkn3; //0x17 uint16_t numTotalCues; //0x19 ?? uint8_t numWaveBanks; //0x1b uint16_t numSounds; //0x1c uint32_t cueNameTableLen; //0x1e uint32_t simpleCuesOffset; //0x22 uint32_t complexCuesOffset; //0x26 uint32_t cueNamesOffset; //0x2a uint32_t unknOffset; //0x2e uint32_t variationTablesOffset; //0x32 uint32_t unknOffset2; //0x36 uint32_t waveBankNameTableOffset; //0x3a uint32_t cueNameHashTableOffset; //0x3e 16-bit hashes each uint32_t cueNameHashValsOffset; //0x42 uint32_t soundsOffset; //0x46 char name[64]; }; struct WaveBankNameTableEntry { char name[64]; } sturct SoundEntry { uint8_t flags; //0x0 uint16_t category; //0x1 ??? uint8_t unkn2; //0x3 uint16_t volume; //0x4 maybe pitch uint8_t unkn3; //0x6 uint16_t entryLength; //0x7 if flags 1 (complex sound): //"clips" uint8_t numClips; //0x9 else: uint16_t trackIndex; //0x9 uint8_t waveBankIndex; //0x11 if flags in 2/4/8: uint16_t extraLen; //0x12 //then a rpc table for each flag if flags in 16: uint16_t extraLen; //0x12 7 //dsp preset table uint8_t num; uint32_t unkn[num]; if flags 1: struct { uint8_t unkn; uint32_t clipOffset; uint32_t unkn2; }[numClips] } sturct SoundClip { uint8_t numEvents; struct ClipEvent[numEvents]; }; struct ClipEvent { uint32_t eventInfo; //event id in lower 5 bits } //event id 1, size 16 struct EventPlayWave : ClipEvent { char unkn[4]; //0x4 uint16_t trackIndex; //0x8 uint8_t waveBank; //0xa uint8_t unkn; //0xb uint16_t unkn2; //0xc uint16_t unkn3; //0xe }; //event id 3, size at least 13 struct EventPlayWaveVariation : ClipEvent { char unkn[5]; int16_t unkn2; int16_t unkn3; struct VariationTable; ///wtf!? } //event id 4, size 40 struct EventPlayWavePitchVolumeFilterVariation : EventPlayWave { struct PitchVolumeFilterVariation; } struct PitchVolumeFilterVariation { int16_t unkn; int16_t unkn2; uint8_t unkn3; uint8_t unkn4; float unkn5; float unkn6; float unkn7; float unkn8; uint16_t flags; } struct SimpleCueEntry { //cue that maps straight to a sound uint8_t flags; uint32_t soundOffset; }; //size 15 struct ComplexCueEntry { uint8_t flags; uint32_t variationTableOffset; uint32_t transitionTableOffset; struct InstanceLimit; }; struct InstanceLimit { uint32_t unkn; uint8_t unkn2; uint8_t unkn3; //dono if here or in ComplexCueEntry }; enum VariationTableType { Wave, ?, ?, ?, CompactWave } struct VariationTable { uint32_t flags; //numEnties in lower 16 bits //flags in upper 16 bits // -table type in bits 3,4,5 uint8_t unkn; uint16_t unkn2; uint8_t unkn3; table 0: struct { uint16_t trackIndex; //? uint8_t waveBank; uint8_t weightMin; //? uint8_t weightMax; //? }[numEntries]; table 1: struct { uint32_t soundOffset; uint8_t weightMin; //? uint8_t weightMax; //? }[numEntries] table 2: struct { uint32_t unkn; uint8_t weightMin; //? uint8_t weightMax; //? }[numEntries] table 3: struct { uint32_t soundOffset; //? float weightMin; float weightMax; uint32_t unkn; }[numEntries] table 4: struct { uint16_t trackIndex; //? uint8_t waveBank; }[numEntries]; }; struct CueNameHashVal { uint32_t nameOffset; uint16_t unkn; }
Global Settings (.xgs)
Defines rules and settings for sounds.
- Categories - sounds can be assigned to a category (only one each) that specifies certain rules like number of instances along with settings like volume. You could create a category for the sounds of one character in your game so they all have the same volume. There are three predefined categories: global, default and Music.
- Variables - these can be defined in the design stage and then referenced by the programmer in code to control Run-Time Parameter Controls
- Run-Time Parameter Controls - also known as 'sliders'. These allow the control of sound parameters as the sound plays. For example they could be used to control the pitch of a car engine sound so as the accelerator is pressed the pitch is changed
- DSP Effect Path Presets (DSPs) - allow effects like reverb to be applied to sounds
- Compression Presets - compression can be applied to waves or wave banks
Open source parsers: