In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "BRSTM file"

From WiiBrew
Jump to navigation Jump to search
(←Created page with 'BRSTM files store sound data. They're used in Mario Kart Wii and possibly other games. They contain an header, followed by a HEAD chunk and a ADPC chunk. All the data in thos...')
 
m (→‎HEAD chunk part 1: Fix variable name)
 
(26 intermediate revisions by 7 users not shown)
Line 1: Line 1:
BRSTM files store sound data. They're used in Mario Kart Wii and possibly other games.
+
BRSTM files contain ADPCM sound data. They are used for music in some games, such as Super Smash Bros. Brawl and Mario Kart Wii.
  
They contain an header, followed by a HEAD chunk and a ADPC chunk.
+
They contain a header, followed by a HEAD chunk, an ADPC chunk and a DATA chunk.<br/>
All the data in those files are big-endian, except where mentioned.
+
All the data in those files are big-endian, except where mentioned.<br/>
 +
All the offsets are absolute (from beginning of file), except where mentioned.<br/>
 +
All the sizes are in bytes, except where mentioned.<br/>
 +
Each chunk is padded to a multiple of 0x20.<br/>
  
 
=== BRSTM header ===
 
=== BRSTM header ===
Line 17: Line 20:
 
| 4
 
| 4
 
| "RSTM" (0x5253544D)
 
| "RSTM" (0x5253544D)
 +
|-
 +
| 0x0004
 +
| 2
 +
| Byte Order Mark (BOM), usually 0xFE 0xFF for big endian.
 +
|-
 +
| 0x0006
 +
| 1
 +
| Major version
 +
|-
 +
| 0x0007
 +
| 1
 +
| Minor version
 +
|-
 +
| 0x0008
 +
| 4
 +
| Size of the whole file
 +
|-
 +
| 0x000C
 +
| 2
 +
| Header size
 +
|-
 +
| 0x000E
 +
| 2
 +
| Number of chunks
 +
|-
 +
| 0x0010
 +
| 4
 +
| Offset to HEAD chunk
 +
|-
 +
| 0x0014
 +
| 4
 +
| Size of HEAD chunk
 +
|-
 +
| 0x0018
 +
| 4
 +
| Offset to ADPC chunk
 +
|-
 +
| 0x001C
 +
| 4
 +
| Size of ADPC chunk
 +
|-
 +
| 0x0020
 +
| 4
 +
| Offset to DATA chunk
 +
|-
 +
| 0x0024
 +
| 4
 +
| Size of DATA chunk
 +
|-
 +
| 0x0028
 +
| 24
 +
| Unknown/Padding (zero)
 +
|}
 +
 +
=== HEAD chunk ===
 +
 +
The HEAD chunk contains information about the brstm file, including sample rate, loop information, volume, panning, and information on each of the ADPCM streams.
 +
 +
This chunk contains 3 internal parts.<br/>
 +
Part 1 contains general information about the file such as loop information, sample rate, and data needed to deinterleave the audio stream.<br/>
 +
Part 2 defines the tracks in the file, and contains volume and panning information for each of them.<br/>
 +
Part 3 contains the information needed to decode the ADPCM audio, including the ADPCM coefficients, and history samples.
 +
 +
Any offsets in the HEAD chunk are relative to offset 0x08 in the HEAD chunk unless otherwise noted.
 +
 +
==== Header ====
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 4
 +
| "HEAD" (0x48454144)
 +
|-
 +
| 0x0004
 +
| 4
 +
| Length of entire HEAD section.
 +
|-
 +
| 0x0008
 +
| 4
 +
| Marker? (0x01000000)
 +
|-
 +
| 0x000C
 +
| 4
 +
| Offset to HEAD chunk part 1
 +
|-
 +
| 0x0010
 +
| 4
 +
| Marker? (0x01000000)
 +
|-
 +
| 0x0014
 +
| 4
 +
| Offset to HEAD chunk part 2
 +
|-
 +
| 0x0018
 +
| 4
 +
| Marker? (0x01000000)
 +
|-
 +
| 0x001C
 +
| 4
 +
| Offset to HEAD chunk part 3
 +
|}
 +
 +
==== HEAD chunk part 1 ====
 +
This part is 0x34 bytes long
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 1
 +
| Codec:
 +
0 - 8-bit PCM<br/>
 +
1 - 16-bit PCM<br/>
 +
2 - 4-bit ADPCM<br/>
 +
|-
 +
| 0x0001
 +
| 1
 +
| Loop flag
 +
|-
 +
| 0x0002
 +
| 1
 +
| Number of channels
 +
|-
 +
| 0x0003
 +
| 0
 +
| Padding? (0x00)
 +
|-
 +
| 0x0004
 +
| 2
 +
| Sample rate
 +
|-
 +
| 0x0006
 +
| 2
 +
| Padding? (0x00)
 +
|-
 +
| 0x0008
 +
| 4
 +
| Loop start in samples
 +
|-
 +
| 0x000C
 +
| 4
 +
| Total sample count
 +
|-
 +
| 0x0010
 +
| 4
 +
| Absolute offset to the beginning of the ADPCM data.
 +
Note that this is ''not'' the beginning of the DATA chunk.
 +
|-
 +
| 0x0014
 +
| 4
 +
| Total block count.
 +
The total number of interlaced blocks in the ADPCM data.
 +
This count includes the final block.
 +
|-
 +
| 0x0018
 +
| 4
 +
| Block Size in bytes.
 +
|-
 +
| 0x001C
 +
| 4
 +
| Samples per block.
 +
|-
 +
| 0x0020
 +
| 4
 +
| Size of the final block without padding in bytes
 +
|-
 +
| 0x0024
 +
| 4
 +
| Samples in the final block.
 +
|-
 +
| 0x0028
 +
| 4
 +
| Size of the final block with padding in bytes
 +
|-
 +
| 0x002C
 +
| 4
 +
| Samples per entry in the ADPC table
 +
|-
 +
| 0x0030
 +
| 4
 +
| Bytes per entry in the ADPC table
 +
|}
 +
 +
==== HEAD chunk part 2 ====
 +
 +
===== Header =====
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 1
 +
| Number of tracks
 +
|-
 +
| 0x0001
 +
| 1
 +
| Track Description Type
 +
|-
 +
| 0x0002
 +
| 2
 +
| Padding? (0x00)
 +
|}
 +
 +
===== Offset table =====
 +
The header contains one of this structure for each track
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 1
 +
| 0x01
 +
|-
 +
| 0x0001
 +
| 1
 +
| Track description type
 +
|-
 +
| 0x0002
 +
| 2
 +
| Padding? (0x00)
 +
|-
 +
| 0x0004
 +
| 4
 +
| Offset to track description
 +
|}
 +
 +
===== Track Descriptions =====
 +
There are at least 2 known types of track descriptions:
 +
 +
{| class="wikitable"
 +
|-
 +
! Type
 +
! Description
 +
|-
 +
| 0
 +
| Used in Super Smash Bros. Brawl
 +
|-
 +
| 1
 +
| Used in other games.
 +
|}
 +
 +
The header contains one track description for each track
 +
 +
====== Track Description Type 0 ======
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 1
 +
| Number of channels in track
 +
|-
 +
| 0x0001
 +
| 1
 +
| Left channel ID if stereo track. Only channel if mono.
 +
|-
 +
| 0x0002
 +
| 1
 +
| Right channel ID if stereo track. 0x00 if mono.
 +
|-
 +
| 0x0003
 +
| 1
 +
| Padding? (0x00)
 +
|}
 +
 +
====== Track Description Type 1 ======
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 1
 +
| Track volume (0x00 to 0x7F)
 +
|-
 +
| 0x0001
 +
| 1
 +
| Track panning (0x00 to 0x7F, Left to right)
 +
|-
 +
| 0x0002
 +
| 2
 +
| Padding? (0x00)
 +
|-
 +
| 0x0004
 +
| 4
 +
| Padding? (0x00)
 +
|-
 +
| 0x0008
 +
| 1
 +
| Number of channels in track
 +
|-
 +
| 0x0009
 +
| 1
 +
| Left channel ID if stereo track. Only channel if mono.
 +
|-
 +
| 0x000A
 +
| 1
 +
| Right channel ID if stereo track. 0x00 if mono.
 +
|-
 +
| 0x000B
 +
| 1
 +
| Padding? (0x00)
 +
|}
 +
 +
==== HEAD chunk part 3 ====
 +
 +
===== Header =====
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 1
 +
| Number of channels
 +
|-
 +
| 0x0001
 +
| 3
 +
| Padding? (0x00)
 +
|}
 +
 +
===== Offset table =====
 +
The header contains one of this structure for each channel
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 4
 +
| Marker (0x01000000)
 +
|-
 +
| 0x0004
 +
| 4
 +
| Offset to channel information
 +
|}
 +
 +
===== ADPCM Channel Information =====
 +
The header contains one of this structure for each channel.
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 4
 +
| Marker (0x01000000)
 +
|-
 +
| 0x0004
 +
| 4
 +
| Offset to channel ADPCM coefficients
 +
|-
 +
| 0x0008
 +
| 0x20
 +
| 16 Int16 ADPCM coefficients
 +
|-
 +
| 0x0028
 +
| 2
 +
| Gain
 +
|-
 +
| 0x002A
 +
| 2
 +
| Initial predictor/scale
 +
|-
 +
| 0x002C
 +
| 2
 +
| History sample 1 (Sample - 1)
 +
|-
 +
| 0x002E
 +
| 2
 +
| History sample 2 (Sample - 2)
 +
|-
 +
| 0x0030
 +
| 2
 +
| Loop predictor/scale<br/>
 +
If BRSTM doesn't loop, these will be the same as the initial predictor/scale and history.
 +
|-
 +
| 0x0032
 +
| 2
 +
| Loop History sample 1 (Sample - 1)
 +
|-
 +
| 0x0034
 +
| 2
 +
| Loop History sample 2 (Sample - 2)
 +
|-
 +
| 0x0036
 +
| 2
 +
| Padding (0x00)
 +
|}
 +
 +
=== ADPC chunk ===
 +
 +
The ADPC chunk contains 2 PCM history samples per channel for every entry in the table.<br/>
 +
The number of samples per entry is specified in the HEAD chunk.<br/>
 +
Each entry in the table contains the final two samples from the preceding block.<br/>
 +
The first entry in the table contains the history samples contained in part 3 of the HEAD chunk.
 +
 +
==== Header ====
 +
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 4
 +
| "ADPC" (0x41445043)
 +
|-
 +
| 0x0004
 +
| 4
 +
| Length of entire ADPC section.
 +
|}
 +
 +
==== ADPC table entry====
 +
The size of each entry is the channel count * 4
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 2
 +
| Channel 0 History sample 1
 +
|-
 +
| 0x0002
 +
| 2
 +
| Channel 0 History sample 2
 +
|-
 +
| 0x0004
 +
| 2
 +
| Channel 1 History sample 1
 +
|-
 +
| 0x0006
 +
| 2
 +
| Channel 1 History sample 2
 +
|-
 +
| ...
 +
| 2
 +
| Channel N History sample 1
 +
|-
 +
| ...
 +
| 2
 +
| Channel N History sample 2
 +
|}
 +
 +
=== DATA chunk ===
 +
 +
The DATA chunk contains ADPCM sound data.
 +
 +
==== Header ====
 +
{| class="wikitable"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0000
 +
| 4
 +
| "DATA" (0x44415441)
 
|-
 
|-
 
| 0x0004
 
| 0x0004
 
| 4
 
| 4
| Magic (0xFEFF0100)
+
| Length of entire DATA section.
 
|-
 
|-
 
| 0x0008
 
| 0x0008
 
| 4
 
| 4
| Size of the whole file
+
| Number of padding samples between header and ADPCM data? Always 0x18
 +
|-
 +
| 0x000C
 +
| 0x14
 +
| Padding (0x00)
 +
|}
 +
 
 +
==== ADPCM Data ====
 +
The ADPCM audio data is interlaced per channel according to the block sizes specified in the header.
 +
 
 +
{| class="wikitable"
 +
|-
 +
! Description
 +
! Size
 +
|-
 +
| Channel 0 block 0
 +
| Block size
 +
|-
 +
| Channel 1 block 0
 +
| Block size
 +
|-
 +
| Channel 0 block 1
 +
| Block size
 +
|-
 +
| Channel 1 block 1
 +
| Block size
 +
|-
 +
| ...
 +
|
 +
|-
 +
| Channel 0 final block
 +
| Final block size
 +
|-
 +
| Channel 1 final block
 +
| Final block size
 
|}
 
|}
 +
 +
[[Category:File formats]]

Latest revision as of 22:57, 29 April 2017

BRSTM files contain ADPCM sound data. They are used for music in some games, such as Super Smash Bros. Brawl and Mario Kart Wii.

They contain a header, followed by a HEAD chunk, an ADPC chunk and a DATA chunk.
All the data in those files are big-endian, except where mentioned.
All the offsets are absolute (from beginning of file), except where mentioned.
All the sizes are in bytes, except where mentioned.
Each chunk is padded to a multiple of 0x20.

BRSTM header

The header is 64 bytes long.

Offset Size Description
0x0000 4 "RSTM" (0x5253544D)
0x0004 2 Byte Order Mark (BOM), usually 0xFE 0xFF for big endian.
0x0006 1 Major version
0x0007 1 Minor version
0x0008 4 Size of the whole file
0x000C 2 Header size
0x000E 2 Number of chunks
0x0010 4 Offset to HEAD chunk
0x0014 4 Size of HEAD chunk
0x0018 4 Offset to ADPC chunk
0x001C 4 Size of ADPC chunk
0x0020 4 Offset to DATA chunk
0x0024 4 Size of DATA chunk
0x0028 24 Unknown/Padding (zero)

HEAD chunk

The HEAD chunk contains information about the brstm file, including sample rate, loop information, volume, panning, and information on each of the ADPCM streams.

This chunk contains 3 internal parts.
Part 1 contains general information about the file such as loop information, sample rate, and data needed to deinterleave the audio stream.
Part 2 defines the tracks in the file, and contains volume and panning information for each of them.
Part 3 contains the information needed to decode the ADPCM audio, including the ADPCM coefficients, and history samples.

Any offsets in the HEAD chunk are relative to offset 0x08 in the HEAD chunk unless otherwise noted.

Header

Offset Size Description
0x0000 4 "HEAD" (0x48454144)
0x0004 4 Length of entire HEAD section.
0x0008 4 Marker? (0x01000000)
0x000C 4 Offset to HEAD chunk part 1
0x0010 4 Marker? (0x01000000)
0x0014 4 Offset to HEAD chunk part 2
0x0018 4 Marker? (0x01000000)
0x001C 4 Offset to HEAD chunk part 3

HEAD chunk part 1

This part is 0x34 bytes long

Offset Size Description
0x0000 1 Codec:

0 - 8-bit PCM
1 - 16-bit PCM
2 - 4-bit ADPCM

0x0001 1 Loop flag
0x0002 1 Number of channels
0x0003 0 Padding? (0x00)
0x0004 2 Sample rate
0x0006 2 Padding? (0x00)
0x0008 4 Loop start in samples
0x000C 4 Total sample count
0x0010 4 Absolute offset to the beginning of the ADPCM data.

Note that this is not the beginning of the DATA chunk.

0x0014 4 Total block count.

The total number of interlaced blocks in the ADPCM data. This count includes the final block.

0x0018 4 Block Size in bytes.
0x001C 4 Samples per block.
0x0020 4 Size of the final block without padding in bytes
0x0024 4 Samples in the final block.
0x0028 4 Size of the final block with padding in bytes
0x002C 4 Samples per entry in the ADPC table
0x0030 4 Bytes per entry in the ADPC table

HEAD chunk part 2

Header
Offset Size Description
0x0000 1 Number of tracks
0x0001 1 Track Description Type
0x0002 2 Padding? (0x00)
Offset table

The header contains one of this structure for each track

Offset Size Description
0x0000 1 0x01
0x0001 1 Track description type
0x0002 2 Padding? (0x00)
0x0004 4 Offset to track description
Track Descriptions

There are at least 2 known types of track descriptions:

Type Description
0 Used in Super Smash Bros. Brawl
1 Used in other games.

The header contains one track description for each track

Track Description Type 0
Offset Size Description
0x0000 1 Number of channels in track
0x0001 1 Left channel ID if stereo track. Only channel if mono.
0x0002 1 Right channel ID if stereo track. 0x00 if mono.
0x0003 1 Padding? (0x00)
Track Description Type 1
Offset Size Description
0x0000 1 Track volume (0x00 to 0x7F)
0x0001 1 Track panning (0x00 to 0x7F, Left to right)
0x0002 2 Padding? (0x00)
0x0004 4 Padding? (0x00)
0x0008 1 Number of channels in track
0x0009 1 Left channel ID if stereo track. Only channel if mono.
0x000A 1 Right channel ID if stereo track. 0x00 if mono.
0x000B 1 Padding? (0x00)

HEAD chunk part 3

Header
Offset Size Description
0x0000 1 Number of channels
0x0001 3 Padding? (0x00)
Offset table

The header contains one of this structure for each channel

Offset Size Description
0x0000 4 Marker (0x01000000)
0x0004 4 Offset to channel information
ADPCM Channel Information

The header contains one of this structure for each channel.

Offset Size Description
0x0000 4 Marker (0x01000000)
0x0004 4 Offset to channel ADPCM coefficients
0x0008 0x20 16 Int16 ADPCM coefficients
0x0028 2 Gain
0x002A 2 Initial predictor/scale
0x002C 2 History sample 1 (Sample - 1)
0x002E 2 History sample 2 (Sample - 2)
0x0030 2 Loop predictor/scale

If BRSTM doesn't loop, these will be the same as the initial predictor/scale and history.

0x0032 2 Loop History sample 1 (Sample - 1)
0x0034 2 Loop History sample 2 (Sample - 2)
0x0036 2 Padding (0x00)

ADPC chunk

The ADPC chunk contains 2 PCM history samples per channel for every entry in the table.
The number of samples per entry is specified in the HEAD chunk.
Each entry in the table contains the final two samples from the preceding block.
The first entry in the table contains the history samples contained in part 3 of the HEAD chunk.

Header

Offset Size Description
0x0000 4 "ADPC" (0x41445043)
0x0004 4 Length of entire ADPC section.

ADPC table entry

The size of each entry is the channel count * 4

Offset Size Description
0x0000 2 Channel 0 History sample 1
0x0002 2 Channel 0 History sample 2
0x0004 2 Channel 1 History sample 1
0x0006 2 Channel 1 History sample 2
... 2 Channel N History sample 1
... 2 Channel N History sample 2

DATA chunk

The DATA chunk contains ADPCM sound data.

Header

Offset Size Description
0x0000 4 "DATA" (0x44415441)
0x0004 4 Length of entire DATA section.
0x0008 4 Number of padding samples between header and ADPCM data? Always 0x18
0x000C 0x14 Padding (0x00)

ADPCM Data

The ADPCM audio data is interlaced per channel according to the block sizes specified in the header.

Description Size
Channel 0 block 0 Block size
Channel 1 block 0 Block size
Channel 0 block 1 Block size
Channel 1 block 1 Block size
...
Channel 0 final block Final block size
Channel 1 final block Final block size