<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multimedia.cx/index.php?action=history&amp;feed=atom&amp;title=XACT</id>
	<title>XACT - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multimedia.cx/index.php?action=history&amp;feed=atom&amp;title=XACT"/>
	<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=XACT&amp;action=history"/>
	<updated>2026-07-10T00:33:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=XACT&amp;diff=14148&amp;oldid=prev</id>
		<title>Espes: It's also a Multimedia API, I guess</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=XACT&amp;diff=14148&amp;oldid=prev"/>
		<updated>2012-08-17T04:34:19Z</updated>

		<summary type="html">&lt;p&gt;It&amp;#039;s also a Multimedia API, I guess&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:34, 16 August 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l247&quot;&gt;Line 247:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 247:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Container Formats]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Container Formats]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Game Formats]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Game Formats]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Multimedia APIs]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Espes</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=XACT&amp;diff=14146&amp;oldid=prev</id>
		<title>Espes: Xact moved to XACT: Capitalise</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=XACT&amp;diff=14146&amp;oldid=prev"/>
		<updated>2012-08-17T04:30:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;/index.php/Xact&quot; class=&quot;mw-redirect&quot; title=&quot;Xact&quot;&gt;Xact&lt;/a&gt; moved to &lt;a href=&quot;/index.php/XACT&quot; title=&quot;XACT&quot;&gt;XACT&lt;/a&gt;: Capitalise&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:30, 16 August 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Espes</name></author>
	</entry>
	<entry>
		<id>https://wiki.multimedia.cx/index.php?title=XACT&amp;diff=14145&amp;oldid=prev</id>
		<title>Espes at 04:29, 17 August 2012</title>
		<link rel="alternate" type="text/html" href="https://wiki.multimedia.cx/index.php?title=XACT&amp;diff=14145&amp;oldid=prev"/>
		<updated>2012-08-17T04:29:07Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;* Extensions: xwb, xsb, xgs&lt;br /&gt;
* Company: [[Microsoft]]&lt;br /&gt;
* Website: http://msdn.microsoft.com/en-us/library/bb174772.aspx&lt;br /&gt;
* Wikipedia article: https://en.wikipedia.org/wiki/Cross-platform_Audio_Creation_Tool&lt;br /&gt;
&lt;br /&gt;
Cross-platform Audio Creation Tool (XACT) is a audio framework released as part of the DirectX SDK.&lt;br /&gt;
&lt;br /&gt;
Distributed XACT projects consist of three file formats:&lt;br /&gt;
&lt;br /&gt;
== Wave Banks (.xwb) ==&lt;br /&gt;
A file format containing a collection of waves&lt;br /&gt;
* Waves - the raw wave data in [[Microsoft Wave|WAV]], [[Audio Interchange File Format|AIFF]], [[Windows Media Audio 9|WMA]], [[Microsoft xWMA|xWMA]] or [[XMA]] formats&lt;br /&gt;
&lt;br /&gt;
Open source parsers:&lt;br /&gt;
* [http://aluigi.altervista.org/papers.htm#unxwb unxwb]&lt;br /&gt;
* [https://github.com/mono/MonoGame/blob/develop3d/MonoGame.Framework/Audio/WaveBank.cs MonoGame]&lt;br /&gt;
&lt;br /&gt;
== Sound Banks (.xsb) ==&lt;br /&gt;
A collection of sounds and cues&lt;br /&gt;
&lt;br /&gt;
* Sounds - a sound has one or more waves together with properties like volume and pitch. Sounds are made up of tracks.&lt;br /&gt;
** Tracks - tracks are made up of events E.g. the simplest track has a Play Wave event&lt;br /&gt;
** Events - various actions that take place within a track. Actions include: Play, Stop, Set Volume, Set Pitch etc.&lt;br /&gt;
* Cues - a cue is used in code to trigger sounds. Each cue is made up of one or more sounds&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sturct SoundBank {&lt;br /&gt;
    struct SoundBankHeader header;&lt;br /&gt;
&lt;br /&gt;
    struct WaveBankNameTableEntry[header.numWaveBanks] wavebankNames;&lt;br /&gt;
    struct SoundEntry[header.numSounds] sounds;&lt;br /&gt;
    struct SimpleCueEntry[header.numSimpleCues] simpleCues;&lt;br /&gt;
    struct ComplexCueEntry[header.numComplexCues] complexCues;&lt;br /&gt;
&lt;br /&gt;
    //...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct SoundBankHeader {&lt;br /&gt;
    uint32_t magic; //               &amp;quot;SDBK&amp;quot;&lt;br /&gt;
    uint16_t toolVersion; //         0x2E&lt;br /&gt;
    uint16_t formatVersion; //       0x2B&lt;br /&gt;
    uint16_t crc; //      fcs16 checksum of all following data&lt;br /&gt;
    uint32_t lastModifiedLow;&lt;br /&gt;
    uint32_t lastModifiedHigh;&lt;br /&gt;
    uint8_t platform; //0x12         ??&lt;br /&gt;
    uint16_t numSimpleCues; //0x13&lt;br /&gt;
    uint16_t numComplexCues; //0x15&lt;br /&gt;
    uint16_t unkn3; //0x17&lt;br /&gt;
    uint16_t numTotalCues; //0x19    ??&lt;br /&gt;
    uint8_t numWaveBanks; //0x1b&lt;br /&gt;
    uint16_t numSounds; //0x1c&lt;br /&gt;
    uint32_t cueNameTableLen; //0x1e&lt;br /&gt;
    &lt;br /&gt;
    uint32_t simpleCuesOffset; //0x22&lt;br /&gt;
    uint32_t complexCuesOffset; //0x26&lt;br /&gt;
    uint32_t cueNamesOffset; //0x2a&lt;br /&gt;
    uint32_t unknOffset; //0x2e&lt;br /&gt;
    uint32_t variationTablesOffset; //0x32&lt;br /&gt;
    uint32_t unknOffset2; //0x36&lt;br /&gt;
    uint32_t waveBankNameTableOffset; //0x3a&lt;br /&gt;
    uint32_t cueNameHashTableOffset; //0x3e    16-bit hashes each&lt;br /&gt;
    uint32_t cueNameHashValsOffset; //0x42&lt;br /&gt;
    uint32_t soundsOffset; //0x46&lt;br /&gt;
    &lt;br /&gt;
    char name[64];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaveBankNameTableEntry {&lt;br /&gt;
    char name[64];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sturct SoundEntry {&lt;br /&gt;
    uint8_t flags; //0x0&lt;br /&gt;
    uint16_t category; //0x1      ???&lt;br /&gt;
    uint8_t unkn2; //0x3&lt;br /&gt;
    uint16_t volume; //0x4 maybe pitch&lt;br /&gt;
    uint8_t unkn3; //0x6&lt;br /&gt;
    uint16_t entryLength; //0x7&lt;br /&gt;
    &lt;br /&gt;
    if flags 1 (complex sound):&lt;br /&gt;
        //&amp;quot;clips&amp;quot;&lt;br /&gt;
        uint8_t numClips; //0x9&lt;br /&gt;
    else:&lt;br /&gt;
        uint16_t trackIndex; //0x9&lt;br /&gt;
        uint8_t waveBankIndex; //0x11&lt;br /&gt;
&lt;br /&gt;
    if flags in 2/4/8:&lt;br /&gt;
        uint16_t extraLen; //0x12&lt;br /&gt;
        //then a rpc table for each flag&lt;br /&gt;
    if flags in 16:&lt;br /&gt;
        uint16_t extraLen; //0x12     7&lt;br /&gt;
&lt;br /&gt;
        //dsp preset table&lt;br /&gt;
         uint8_t num;&lt;br /&gt;
         uint32_t unkn[num];&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
    if flags 1:&lt;br /&gt;
        struct {&lt;br /&gt;
            uint8_t unkn;&lt;br /&gt;
            uint32_t clipOffset;&lt;br /&gt;
            uint32_t unkn2;&lt;br /&gt;
        }[numClips]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sturct SoundClip {&lt;br /&gt;
    uint8_t numEvents;&lt;br /&gt;
    struct ClipEvent[numEvents];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct ClipEvent {&lt;br /&gt;
    uint32_t eventInfo; //event id in lower 5 bits&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//event id 1, size 16&lt;br /&gt;
struct EventPlayWave : ClipEvent {&lt;br /&gt;
    char unkn[4]; //0x4&lt;br /&gt;
    uint16_t trackIndex; //0x8&lt;br /&gt;
    uint8_t waveBank; //0xa&lt;br /&gt;
    uint8_t unkn; //0xb&lt;br /&gt;
    uint16_t unkn2; //0xc&lt;br /&gt;
    uint16_t unkn3; //0xe&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//event id 3, size at least 13&lt;br /&gt;
struct EventPlayWaveVariation : ClipEvent {&lt;br /&gt;
    char unkn[5];&lt;br /&gt;
    int16_t unkn2;&lt;br /&gt;
    int16_t unkn3;&lt;br /&gt;
&lt;br /&gt;
    struct VariationTable; ///wtf!?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//event id 4, size 40&lt;br /&gt;
struct EventPlayWavePitchVolumeFilterVariation : EventPlayWave {&lt;br /&gt;
    struct PitchVolumeFilterVariation;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct PitchVolumeFilterVariation {&lt;br /&gt;
    int16_t unkn;&lt;br /&gt;
    int16_t unkn2;&lt;br /&gt;
    uint8_t unkn3;&lt;br /&gt;
    uint8_t unkn4;&lt;br /&gt;
    float unkn5;&lt;br /&gt;
    float unkn6;&lt;br /&gt;
    float unkn7;&lt;br /&gt;
    float unkn8;&lt;br /&gt;
    uint16_t flags;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct SimpleCueEntry { //cue that maps straight to a sound&lt;br /&gt;
    uint8_t flags;&lt;br /&gt;
    uint32_t soundOffset;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//size 15&lt;br /&gt;
struct ComplexCueEntry {&lt;br /&gt;
    uint8_t flags;&lt;br /&gt;
    uint32_t variationTableOffset;&lt;br /&gt;
    uint32_t transitionTableOffset;&lt;br /&gt;
    struct InstanceLimit;&lt;br /&gt;
    &lt;br /&gt;
};&lt;br /&gt;
struct InstanceLimit {&lt;br /&gt;
    uint32_t unkn;&lt;br /&gt;
    uint8_t unkn2;&lt;br /&gt;
    uint8_t unkn3; //dono if here or in ComplexCueEntry&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum VariationTableType {&lt;br /&gt;
    Wave,&lt;br /&gt;
    ?,&lt;br /&gt;
    ?,&lt;br /&gt;
    ?,&lt;br /&gt;
    CompactWave&lt;br /&gt;
}&lt;br /&gt;
struct VariationTable {&lt;br /&gt;
    uint32_t flags;&lt;br /&gt;
        //numEnties in lower 16 bits&lt;br /&gt;
        //flags in upper 16 bits&lt;br /&gt;
        //      -table type in bits 3,4,5&lt;br /&gt;
    uint8_t unkn;&lt;br /&gt;
    uint16_t unkn2;&lt;br /&gt;
    uint8_t unkn3;&lt;br /&gt;
    &lt;br /&gt;
    table 0:&lt;br /&gt;
    struct {&lt;br /&gt;
        uint16_t trackIndex; //?&lt;br /&gt;
        uint8_t waveBank;&lt;br /&gt;
        uint8_t weightMin; //?&lt;br /&gt;
        uint8_t weightMax; //?&lt;br /&gt;
    }[numEntries];&lt;br /&gt;
    &lt;br /&gt;
    table 1:&lt;br /&gt;
    struct {&lt;br /&gt;
        uint32_t soundOffset;&lt;br /&gt;
        uint8_t weightMin; //?&lt;br /&gt;
        uint8_t weightMax; //?&lt;br /&gt;
    }[numEntries]&lt;br /&gt;
    &lt;br /&gt;
    table 2:&lt;br /&gt;
    struct {&lt;br /&gt;
        uint32_t unkn;&lt;br /&gt;
        uint8_t weightMin; //?&lt;br /&gt;
        uint8_t weightMax; //?&lt;br /&gt;
    }[numEntries]&lt;br /&gt;
    &lt;br /&gt;
    table 3:&lt;br /&gt;
    struct {&lt;br /&gt;
        uint32_t soundOffset; //?&lt;br /&gt;
        float weightMin;&lt;br /&gt;
        float weightMax;&lt;br /&gt;
        uint32_t unkn;&lt;br /&gt;
    }[numEntries]&lt;br /&gt;
    &lt;br /&gt;
    table 4:&lt;br /&gt;
    struct {&lt;br /&gt;
        uint16_t trackIndex; //?&lt;br /&gt;
        uint8_t waveBank;&lt;br /&gt;
    }[numEntries];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct CueNameHashVal {&lt;br /&gt;
    uint32_t nameOffset;&lt;br /&gt;
    uint16_t unkn;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Global Settings (.xgs) ==&lt;br /&gt;
Defines rules and settings for sounds. &lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Variables - these can be defined in the design stage and then referenced by the programmer in code to control Run-Time Parameter Controls&lt;br /&gt;
** 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&lt;br /&gt;
* DSP Effect Path Presets (DSPs) - allow effects like reverb to be applied to sounds &lt;br /&gt;
* Compression Presets - compression can be applied to waves or wave banks&lt;br /&gt;
&lt;br /&gt;
Open source parsers:&lt;br /&gt;
* [https://github.com/espes/MonoGame/blob/develop3d/MonoGame.Framework/Audio/AudioEngine.cs MonoGame]&lt;br /&gt;
&lt;br /&gt;
[[Category:Container Formats]]&lt;br /&gt;
[[Category:Game Formats]]&lt;/div&gt;</summary>
		<author><name>Espes</name></author>
	</entry>
</feed>