A binary Sound effect (*.sfx
) container is actually three or four different file types that share the same extension, these files are heavily platform-dependent. They are used for level soundbanks, streamed sounds and music tracks.
Generally the audio data itself is ADPCM-encoded, so that it can be decoded by the embedded hardware.
- IMA ADPCM with stereo channels interleaved: GameCube, PC (always software-decoded).
- Sony VAG: PlayStation 2.
- Xbox ADPCM: Xbox.
- GameCube DSP ADPCM: GameCube (used in the final release; hardware playback, for speed).
All the following files were originally configured and exported using a custom GUI program called EuroSound that, unlike EuroLand, is no longer available, and the program itself is not useful because no source files were preserved.
An open-source replacement is currently being developed to mux and demux soundbanks into YAML and plain *.wav
files.
Soundbanks[]
Every level stores all of the used sound effects in its own sound bank, each sound effect has a series of flags and properties and contains a variable array of raw sound samples (PCM in PC, sometimes ADPCM-encoded in some sixth-generation consoles).
Soundbank files[]
These are defined via hashcode in one of the last columns of X:\Sphinx\Grafix\Spreadsheets\LevelData.xls
. Then, at runtime, when a level loads its corresponding .EDB files, also searches for that hashcode in X:\Sphinx\Binary\_bin_PC\_Eng\HCXXXXXX.sfx
. Unprefixed, formatted in hexadecimal, by masking out the hashcode type section.
There are two exceptions that are hardcoded to try to load at game startup:
HC00FFFF.SFX
(the single, special stream file; which has a different format).HCFFFFFF.SFX
(a special soundbank; the base/common/fallback soundbank?).
Stream file (HC00FFFF.SFX
)[]
Most of the long, streamed ambient sounds are actually stored here once instead of being duplicated in each soundbank, each soundbank references an index in the list of streamed sounds, the engine knows it is streamed because unlike most other internal indices, streamed ones are negative and seemingly stored in twos' complement.
It has a format very similar to a streamed music file, and there is only one file that is permanently kept loaded in memory. It's usually located in X:\Sphinx\Binary\_bin_PC\_Eng\HC00FFFF.SFX
, but retrieved as ./_bin_PC/_Eng/HC00FFFF.SFX
in the remastered port.
Sound details descriptor (SFX_Data.bin
)[]
Contains a special binary array, even if most of that data is redundant; but it probably exists to avoid having to load each soundbank just to get properties like the length of a sound. This table is generally kept resident in memory during the entire session. The corresponding data is available as a C-style header in the Sonix folder of the Authoring Tools. See SFX_Data.h.
Confusingly, it's stored in X:\Sphinx\Binary\_bin_PC\music\SFX_Data.bin
when it doesn't have anything to do with music, but the EngineX programmers at Eurocom probably chose this because sounds are supposed to vary per language (and hence, loaded from a different folder) so they needed a static but common path to put this. Even if, in practice, only the English folder is actually in use; because there aren't voice overs in the final version, even when multi-language support was planned almost from the start.
Music track files[]
These streamed files are loaded on demand from X:\Sphinx\Binary\_bin_PC\music\HCE?????.SFX
. Each music track is defined via hashcode and stored in its own file. A music file usually contains a list of (also hashcode-defined) jump points and start points. Almost every track has a lead-in time, a middle looping section, and —occasionally— a small ending that is not generally used. These files always store ADPCM-encoded sound.
File format data structures[]
Until this point there has been a rough overview of how the whole audio system comes together. From this point onward we will describe and document in detail the inner workings of all these sound-related EngineX files and their internal layouts, so that other third-party tools can interoperate with them, creating their own sounds and music tracks for mods.
For any questions please visit the #mod-dev
channel in the official Sphinx Discord server, or ping/mention @Swyter
.
Soundbank file structure[]
Soundbank header | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Offset | Size | Description | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
4
|
Contains a four-byte string with the magic value MUSX . 4D 55 53 58 in hex.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4h
|
4
|
Hashcode for the current soundbank without the section prefix, should mirror the hexadecimal filename. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8h
|
4
|
Constant offset to the next section, probably unused. Always 0xC9 for all soundbanks.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ch
|
4
|
Size of the whole file, in bytes. Unused. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10h
|
4
|
SFX start; an offset that points to the section where soundbanks are stored, always 0x800 in the original software.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14h
|
4
|
SFX length; size of the first section, in bytes. Depends on how many elements are present, so it varies. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18h
|
4
|
Sample info start; offset to the second section where the sample properties are stored. Usually goes right after the previous section. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Ch
|
4
|
Sample info length; size of the second section, in bytes. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
20h
|
4
|
Special sample info start; unused and uses the same sample data offset as dummy for some reason. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
24h
|
4
|
Special sample info length; unused and set to zero. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
28h
|
4
|
Sample data start. Offset that points to the beginning of the PCM data, where sound is actually stored. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2Ch
|
4
|
Sample data length. Size of the block, in bytes. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SFX elements, relative to the SFX start block (i.e. 0x800 )
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
4
|
SFX entry count in this soundbank. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4h
|
8
|
Linear array of sorted SFX headers laid out in this format, for fast binary search at runtime:
In turn, each SFX entry —or parameter block— is made out of the following fields:
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sample info elements, relative to their own section | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
4
|
Sample info count in this soundbank. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4h
|
40
|
Linear array of sample header elements, each element is made out of the following fields:
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sample data, relative to the (guess what) sample data section offset | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
~
|
All the raw PCM data goes in this section, sequentially, as a blob, with some alignment guarantees, but nothing hardcoded. The engine accesses each of them by using the sample info address field. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Special sample info block; relative to the special sample info section offset
ADPCM metadata and parameters for the GameCube DSP (hardware) decoder, missing/unneeded in other platforms | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
96
|
To get the number of elements in this section, divide the total size of the block by one element worth of bytes (0x60 ). The engine loads this section separately and accesses each entry through the PSI sample header offset of the sample info structure above. This section doesn't exist on anything other than GameCube.
|
One soundbank stores various sound effects (SFXs) that are used for the matching level, one SFX can use one or more sound samples (samples), the data of the samples themselves can be shared between various SFXs, each SFX properties descriptor has one or more sample pool elements with custom playback properties, each of them has an index that points to the sample info array (or to the stream file if negative) but the pool properties are a unique way of modulating those shared PCM samples without having to have two versions of the same data, through pitch correction, changing volume or other means.
Stream file structure[]
Soundbank header | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Offset | Size | Description | ||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
4
|
Contains a four-byte string with the magic value MUSX . 4D 55 53 58 in hex.
| ||||||||||||||||||||||||||||||||||||||||||||||||
4h
|
4
|
Hashcode for the current soundbank without the section prefix, should mirror the hexadecimal filename. Always 0xFFFF . See StreamFileHashCode in SFX_Defines.h .
| ||||||||||||||||||||||||||||||||||||||||||||||||
8h
|
4
|
Constant offset to the next section, probably unused. Always 0xC9 for all soundbanks.
| ||||||||||||||||||||||||||||||||||||||||||||||||
Ch
|
4
|
Size of the whole file, in bytes. Unused. | ||||||||||||||||||||||||||||||||||||||||||||||||
10h
|
4
|
File start 1; an offset that points to the stream look-up file details. Set to 0x800 in the original software.
| ||||||||||||||||||||||||||||||||||||||||||||||||
14h
|
4
|
File length 1; size of the first section, in bytes. | ||||||||||||||||||||||||||||||||||||||||||||||||
18h
|
4
|
File start 2; offset to the second section with the sample data. Set to 0x1000 in the original software.
| ||||||||||||||||||||||||||||||||||||||||||||||||
1Ch
|
4
|
File length 2; size of the second section, in bytes. | ||||||||||||||||||||||||||||||||||||||||||||||||
20h
|
4
|
File start 3; unused offset. Set to zero. | ||||||||||||||||||||||||||||||||||||||||||||||||
24h
|
4
|
File length 3; unused. Set to zero. | ||||||||||||||||||||||||||||||||||||||||||||||||
Stream look-up table, relative to the file start 1 block (i.e. 0x800 )
| ||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
~
|
An array of offsets, linear, sorted, no hashcodes here, the index is the negative-turned-positive file ref in other soundbank files' sample pools:
The number of streams to load is found (manually) by dividing the section size in the header, see file length 1 above, by the size of one stream look-up detail element ( | ||||||||||||||||||||||||||||||||||||||||||||||||
Stream file details, relative to the file start 2 block (i.e. 0x1000 )
| ||||||||||||||||||||||||||||||||||||||||||||||||||
0h
|
4
|
Marker size. These recursive structures that follow are variable, this covers the whole structure for the stream. | ||||||||||||||||||||||||||||||||||||||||||||||||
4h
|
4
|
Audio offset. Where the raw ADPCM data is located. Relative to the current section. Generally 0x1000 bytes after the current structure, they go inline. Unlike other soundbank elements that are sorted and separated by type.
| ||||||||||||||||||||||||||||||||||||||||||||||||
8h
|
4 | Audio size, in bytes. | ||||||||||||||||||||||||||||||||||||||||||||||||
Ch
|
14
|
Stream marker header data.
| ||||||||||||||||||||||||||||||||||||||||||||||||
20h
|
34
|
A linear array containing the music marker start data. Each entry is laid out like this:
| ||||||||||||||||||||||||||||||||||||||||||||||||
~
|
32
|
A linear array of stream marker data elements. Notice how each start data structure above contains/embeds their own copy of the stream marker that will come afterwards. In general, every streamed sample contains at least two music markers; a Start and an End one. Each entry is laid out like this:
|
Here's an example of the marker layout for your normal streamed sound with an end point:
- Start marker data (1 element):
- Marker pos:
0
, State:00000000h
/00000000h
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
- Marker pos:
- Markers (2 elements):
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
-1
, Pos:5D000h
, Type:End
, Marker count:1
- Name:
Here is an example of the marker layout for an streamed sound with a looped part, we can appreciate here that the marker positions are 0/1/3, and they match the ordering of the same Start
markers in the fourth-element table, skipping the Loop
(index 2) one:
- Start marker data (3 elements):
- Marker pos:
0
, State:00000000h
/00000000h
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
- Marker pos:
1
, State:00000000h
/00000000h
- Name:
1
, Pos:0h
, Type:Start
, Marker count:1
- Name:
- Marker pos:
3
, State:34B0F8AFh
/34B0F8AFh
- Name:
2
, Pos:40028h
, Type:Start
, Marker count:2
- Name:
- Marker pos:
- Markers (4 elements):
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
1
, Pos:0h
, Type:Start
, Marker count:1
- Name:
1
, Pos:40028h
, Type:Loop
, Marker count:2
, Loop marker count:1
, Loop start:0h
- Name:
2
, Pos:40028h
, Type:Start
, Marker count:2
- Name:
Another similar example, but that instead of looping back to the beginning, loops to a middle point:
- Start marker data (3 elements):
- Marker pos:
0
, State:00000000h
/00000000h
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
- Marker pos:
1
, State:0DBBFE07h
/0DBBFE07h
- Name:
1
, Pos:46000h
, Type:Start
, Marker count:1
- Name:
- Marker pos:
3
, State:00000000h
/00000000h
- Name:
2
, Pos:304000h
, Type:Start
, Marker count:2
- Name:
- Marker pos:
- Markers (4 elements):
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
1
, Pos:46000h
, Type:Start
, Marker count:1
- Name:
1
, Pos:304000h
, Type:Loop
, Marker count:2
, Loop marker count:1
, Loop start:46000h
- Name:
2
, Pos:304000h
, Type:Start
, Marker count:2
- Name:
Another looping example:
- Start marker data (3 elements):
- Marker pos:
0
, State:00000000h
/00000000h
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
- Marker pos:
1
, State:00000000h
/00000000h
- Name:
1
, Pos:14h
, Type:Start
, Marker count:1
- Name:
- Marker pos:
3
, State:2F280040h
/2F280040h
- Name:
2
, Pos:61FF8h
, Type:Start
, Marker count:2
- Name:
- Marker pos:
- Markers (4 elements):
- Name:
0
, Pos:0h
, Type:Start
, Marker count:0
- Name:
1
, Pos:14h
, Type:Start
, Marker count:1
- Name:
1
, Pos:61FF8h
, Type:Loop
, Marker count:2
, Loop marker count:1
, Loop start:14h
- Name:
2
, Pos:61FF8h
, Type:Start
, Marker count:2
- Name:
Music file structure[]
Music files are very similar in spirit to the stream file (in fact, the streamed playback system that handles both is the exact same). But each music track is stored separately, contains a single stream, and it is loaded on the spot.
Music header | ||||
---|---|---|---|---|
Offset | Size | Description | ||
0h
|
4
|
Contains a four-byte string with the magic value MUSX . 4D 55 53 58 in hex.
| ||
4h
|
4
|
Hashcode for the current music bank without the section prefix, should mirror the hexadecimal filename. Always starts with 0xE _____, the music hashcode subtype.
| ||
8h
|
4
|
Constant offset to the next section, probably unused. Always 0xC9 for all soundbanks.
| ||
Ch
|
4
|
Size of the whole file, in bytes. Unused. | ||
10h
|
4
|
File start 1; an offset that points to the stream look-up file details. Set to 0x800 in the original software.
| ||
14h
|
4
|
File length 1; size of the first section, in bytes. | ||
18h
|
4
|
File start 2; offset to the second section with the sample data. Set to 0x1000 in the original software.
| ||
1Ch
|
4
|
File length 2; size of the second section, in bytes. | ||
20h
|
4
|
File start 3; unused offset. Set to zero. | ||
24h
|
4
|
File length 3; unused. Set to zero. | ||
Music/stream header data/file details, relative to the file start 1 block (i.e. 0x800 )
| ||||
0h
|
14
|
Music marker header data.
| ||
20h
|
34
|
A linear array containing the music marker start data. Each entry is laid out like this:
| ||
~
|
32
|
A linear array of stream marker data elements. Notice how each start data structure above contains/embeds their own copy of the stream marker that will come afterwards.
| ||
Music audio data, relative to the file start 2 block (i.e. 0x1000 )
| ||||
0h
|
~ | Start offset of the music audio data. See the stream file section for details, same thing. |
SBInfo file structure (HCFFFFFF.SFX
)[]
The structure of this file is very similar to the music files and stream files. This file seems to be unused by the game code. It basically includes two arrays, one with all soundbank hashcodes stored in the first section, and another one with the musicbank hashcodes stored in the second one.
Offset | Size | Description |
---|---|---|
0h | 4 | Contains a four-byte string with the magic value MUSX . 4D 55 53 58 in hexadecimal.
|
4h | 4 | Hashcode for the current file. Always 0x00FFFFFF .
|
8h | 4 | File version. |
Ch | 4 | Size of the whole file, in bytes. Unused. |
10h
|
4
|
File start 1; an offset that points to the soundbanks hashcodes array. Set to 0x800 in the original software.
|
14h
|
4
|
File length 1; size of the first section, in bytes, it has a maximum size of 600 bytes. |
18h
|
4
|
File start 2; offset to the second section with the musicbanks hashcodes array. Set to 0x1000 in the original software.
|
1Ch
|
4
|
File length 2; size of the second section, in bytes, it has a maximum size of 600 bytes. |
20h
|
4
|
File start 3; unused offset. Set to zero. |
24h
|
4
|
File length 3; unused. Set to zero. |
SoundBank hashcodes array, relative to the file start 1 block (i.e. 0x800 )
| ||
0h
|
600
|
An array containing all soundbank hashcodes that the current game has. |
MusicBank hashcodes array, relative to the file start 2 block (i.e. 0x1000 )
| ||
0h
|
600
|
An array containing all musicbank hashcodes that the current game has. |
Formats and frequencies[]
Streamed (i.e. music) sounds use a hardcoded playback setup depending on the underlying platform and DSP:
Platform | Initial music volume | Music playback frequency | Maximum active voices | Streams playback frequency | Compression, sample encoding | Software decode |
---|---|---|---|---|---|---|
PS2 | 75 | 32000 Hz | 20 | 22050 Hz | Headerless Sony VAG (yes, always ADPCM) | |
PC | 60 | 32000 Hz | 20 | 22050 Hz | IMA ADPCM | ✓ |
Xbox | 75 | 44100 Hz | 40 | 22050 Hz | Xbox ADPCM | |
GameCube | 55 | 32000 Hz | 20 | 22050 Hz | IMA ADPCM | Early on, uses DSP on final versions |
SFX_Data.bin
file structure[]
Because the structure data (and their field names) are already publicly available in various text formats as part of the Authoring Tools DLC, I can freely publish a similar 010 Editor binary template with my own comments and notes below, for a more complete understanding:
//------------------------------------------------
//--- 010 Editor v9.0.1 Binary Template
//
// File: Sphinx SFX_Data.bin files (support array that is stored under _bin_PC/Music for some reason)
// Authors: Swyter
// Version: 2018.11.26
// Purpose: It stores some duplicated data in an optimized/permanent way to avoid the costs of depending on big, loadable soundbanks that might not be available yet.
// Needed for sound effects to work, as some values are actually retrieved from here instead of their corresponding bank. Probably generated by EuroSound.
// Why here? In theory the sound folder is per-language and can vary (even if in practice only _bin_PC/_Eng exists) they decided to put this file there.
// Category: Audio
// File Mask: sfx_data.bin, SFX_Data.bin
// ID Bytes: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // swy: first sfxOutputDetails always empty
// History: Cleaned up and commented on 2019.05.22
//------------------------------------------------
typedef int32 s32;
typedef uint32 u32;
struct sfxOutputDetails
{
u32 hashcode <format=hex>; /* swy: unique constant value that should have a matching SFX_* tag in SFX_Defines.h */
float innerRadius; /* swy: where it reaches full volume; in meters */
float outerRadius; /* swy: so far away that it has completely faded out; in meters */
float alertness; /* swy: unused in the final version, I think; this was used for the scrapped mummy/guards sneak sections and Metal Gear Solid-like AI */
float duration; /* swy: cumulative length of all the samples in seconds, I think? */
byte looping;
byte tracking3D; /* swy: special 3D trigger-like sound emitters (how are they different from trackingless '3D'?) */
byte sampleStreamed; /* swy: streamed 'ambient' sound effects made out of samples that are stored in _bin_PC/_Eng/HC00FFFF.SFX; special sound-bank that is always loaded */
byte pad;
} thing[FileSize() / sizeof(sfxOutputDetails)];
SFX versions in Eurocom games
[]
The EngineX audio subsystem had, at least, five known public revisions of the SFX/MusX file formats. All of them were very similar, the main difference is that newer versions added more fields, especially in the SFX parameters section, and removed some others that were unused in the newer versions of the audio engine, internally called EuroAudio.
Game | Release year | Platforms | SFX version | Notes |
---|---|---|---|---|
Buffy the Vampire Slayer: Chaos Bleeds | 2003 | GameCube, PS2, Xbox, PC | 201
|
This seems to be the first public version, as officially documented above. |
Sphinx and the Cursed Mummy | ||||
Athens 2004 | 2004 | PS2 | 1
|
Uses the same file-structure that the 201 uses. |
Spyro: A Hero's Tail | 2004 | GameCube, PS2, Xbox | 4
|
Header differences:
After the file size field, adds:
Soundbanks: SFX parameters differences
Soundbanks: Sample info differences Some unnecessary fields are removed here:
StreamFile: StartMarker differences Some fields are removed here:
StreamFile: Marker differences Some fields are removed here:
|
Robots | 2005 | GameCube, PS2, Xbox | 5
|
Some fields changed their type. For example, the SFX flags here are are stored as an array of 16 bytes.
Soundbanks: SFX parameters differences
|
Predator: Concrete Jungle | PS2, Xbox | |||
Batman Begins | GameCube, PS2, Xbox | 6 | Soundbanks: SFX parameter differences
| |
Ice Age 2: The Meltdown | 2006 | GameCube, PS2, Xbox, PC, Wii | ||
Pirates of the Caribbean: At World's End | 2007 | Xbox 360, PlayStation 3, Wii, PlayStation 2, PSP, PC | 10
|
From this version onward the file format has been completely rewritten. |