BCWAV: Difference between revisions
Jump to navigation
Jump to search
Steveice10 (talk | contribs) |
B doesn't stand for Banner, but for Binary (same all of the other NW4C related file formats). |
||
(12 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:File formats]] | [[Category:File formats]] | ||
This document is about the format of | This document is about the format of Binary CTR Wave files (BCWAV). The structure is very similar to Microsoft's Wave file. | ||
The structure is very similar to Microsoft's Wave file | |||
=== Overview === | === Overview === | ||
Microsoft's | Microsoft's WAV structure is RIFF Header which defines the data inside which is WAVE, then the media player expects a "fmt " chunk and a "data" chunk. Nintendo's format uses a CWAV header (no need for a general structure for media, only wave), which points to an INFO struct (the equivalent to fmt) and a DATA struct (the equivalent to data). | ||
then the media player expects "fmt " chunk and a "data" chunk. | |||
Nintendo's format uses a CWAV | |||
=== Header === | === Header === | ||
Line 26: | Line 16: | ||
| 0x004 || 2 || Endianness (0xFEFF = little, 0xFFFE = big) | | 0x004 || 2 || Endianness (0xFEFF = little, 0xFFFE = big) | ||
|- | |- | ||
| 0x006 || 2 || Header Size (0x40) | | 0x006 || 2 || Header Size (0x40 due to [[#Info Block|Info Block]] alignment) | ||
|- | |- | ||
| 0x008 || 4 || Version (0x02010000) | | 0x008 || 4 || Version (0x02010000) | ||
Line 36: | Line 26: | ||
| 0x012 || 2 || Reserved | | 0x012 || 2 || Reserved | ||
|- | |- | ||
| 0x014 || 12 || [[ | | 0x014 || 12 || [[#Info Block|Info Block]] [[#Sized Reference|Sized Reference]] (Offset relative to start of file) | ||
|- | |- | ||
| 0x020 || 12 || [[ | | 0x020 || 12 || [[#Data Block|Data Block]] [[#Sized Reference|Sized Reference]] (Offset relative to start of file) | ||
|} | |} | ||
Line 60: | Line 48: | ||
! MAGIC !! TYPE | ! MAGIC !! TYPE | ||
|- | |- | ||
| INFO || [[ | | INFO || [[#Info Block|Info Block]] | ||
|- | |- | ||
| DATA || [[ | | DATA || [[#Data Block|Data Block]] | ||
|} | |} | ||
Line 71: | Line 59: | ||
! OFFSET !! SIZE !! DESCRIPTION | ! OFFSET !! SIZE !! DESCRIPTION | ||
|- | |- | ||
| 0x000 || 8 || [[ | | 0x000 || 8 || [[#Block Header|Block Header]] | ||
|- | |- | ||
| 0x008 || 1 || [[ | | 0x008 || 1 || [[#Encoding|Encoding]] | ||
|- | |- | ||
| 0x009 || 1 || Loop (0 = don't loop, 1 = loop) | | 0x009 || 1 || Loop (0 = don't loop, 1 = loop) | ||
Line 87: | Line 75: | ||
| 0x018 || 4 || Reserved | | 0x018 || 4 || Reserved | ||
|- | |- | ||
| 0x01C || | | 0x01C || X || [[#Channel Info|Channel Info]] [[#Reference Table|Reference Table]] | ||
|- | |||
| X || X || [[#Channel Info|Channel Info]] Entries | |||
|} | |} | ||
If encoding is DSP ADPCM: | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 96: | Line 86: | ||
! OFFSET !! SIZE !! DESCRIPTION | ! OFFSET !! SIZE !! DESCRIPTION | ||
|- | |- | ||
| | | X || X || [[#DSP ADPCM Info|DSP ADPCM Info]] Entries | ||
|} | |||
If encoding is IMA ADPCM: | |||
{| class="wikitable" border="1" | |||
|- | |||
! OFFSET !! SIZE !! DESCRIPTION | |||
|- | |- | ||
| | | X || X || [[#IMA ADPCM Info|IMA ADPCM Info]] Entries | ||
|} | |} | ||
=== Encoding === | The info block is aligned to 0x20 bytes. | ||
==== Encoding ==== | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 116: | Line 115: | ||
|} | |} | ||
=== Channel Info === | ==== Channel Info ==== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 122: | Line 121: | ||
! OFFSET !! SIZE !! DESCRIPTION | ! OFFSET !! SIZE !! DESCRIPTION | ||
|- | |- | ||
| 0x000 || 8 || Samples [[ | | 0x000 || 8 || Samples [[#Reference|Reference]] (Offset relative to [[#Data Block|Data Block]] Data field) | ||
|- | |- | ||
| 0x008 || 8 || ADPCM Info [[ | | 0x008 || 8 || ADPCM Info [[#Reference|Reference]] (Offset relative to Samples [[#Reference|Reference]] field) | ||
|- | |- | ||
| 0x010 || 4 || Reserved | | 0x010 || 4 || Reserved | ||
|} | |} | ||
=== DSP ADPCM Info === | ===== DSP ADPCM Info ===== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 135: | Line 134: | ||
! OFFSET !! SIZE !! DESCRIPTION | ! OFFSET !! SIZE !! DESCRIPTION | ||
|- | |- | ||
| 0x000 || 32 || [[ | | 0x000 || 32 || [[#DSP ADPCM Param|Param]] | ||
|- | |||
| 0x020 || 6 || [[#DSP ADPCM Context|Context]] | |||
|- | |- | ||
| | | 0x026 || 6 || Loop [[#DSP ADPCM Context|Context]] | ||
|- | |- | ||
| | | 0x02C || 2 || Padding | ||
|} | |} | ||
=== DSP ADPCM Param === | ====== DSP ADPCM Param ====== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 151: | Line 152: | ||
|} | |} | ||
=== DSP ADPCM Context === | ====== DSP ADPCM Context ====== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 166: | Line 167: | ||
|} | |} | ||
=== IMA ADPCM Info === | ===== IMA ADPCM Info ===== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 172: | Line 173: | ||
! OFFSET !! SIZE !! DESCRIPTION | ! OFFSET !! SIZE !! DESCRIPTION | ||
|- | |- | ||
| 0x000 || 4 || [[ | | 0x000 || 4 || [[#IMA ADPCM Context|Context]] | ||
|- | |- | ||
| 0x004 || 4 || Loop [[ | | 0x004 || 4 || Loop [[#IMA ADPCM Context|Context]] | ||
|} | |} | ||
=== IMA ADPCM Context === | ====== IMA ADPCM Context ====== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 189: | Line 190: | ||
| 0x003 || 1 || Padding | | 0x003 || 1 || Padding | ||
|} | |} | ||
=== Data Block === | |||
{| class="wikitable" border="1" | |||
|- | |||
! OFFSET !! SIZE !! DESCRIPTION | |||
|- | |||
| 0x000 || 8 || [[#Block Header|Block Header]] | |||
|- | |||
| 0x008 || [[#Block Header|Block Header]] Size Value - 8 || Data | |||
|} | |||
The data block is aligned to 0x20 bytes, as well as the data field's actual sample data. | |||
=== Reference Table === | === Reference Table === | ||
Line 198: | Line 212: | ||
| 0x000 || 4 || Count | | 0x000 || 4 || Count | ||
|- | |- | ||
| 0x004 || Count * 8 || [[ | | 0x004 || Count * 8 || [[#Reference|References]] (Offsets relative to Count field) | ||
|} | |} | ||
Line 207: | Line 221: | ||
! OFFSET !! SIZE !! DESCRIPTION | ! OFFSET !! SIZE !! DESCRIPTION | ||
|- | |- | ||
| 0x000 || 8 || [[ | | 0x000 || 8 || [[#Reference|Reference]] | ||
|- | |- | ||
| 0x008 || 4 || Size | | 0x008 || 4 || Size | ||
Line 222: | Line 236: | ||
| 0x002 || 2 || Padding | | 0x002 || 2 || Padding | ||
|- | |- | ||
| 0x004 || 4 || Offset | | 0x004 || 4 || Offset ("null" = 0xFFFFFFFF) | ||
|} | |} | ||
Line 231: | Line 245: | ||
! ID !! TYPE | ! ID !! TYPE | ||
|- | |- | ||
| 0x0300 || [[ | | 0x0300 || [[#DSP ADPCM Info|DSP ADPCM Info]] | ||
|- | |- | ||
| 0x0301 || [[ | | 0x0301 || [[#IMA ADPCM Info|IMA ADPCM Info]] | ||
|- | |- | ||
| 0x1F00 || [[ | | 0x1F00 || [[#Data_Block|Sample Data]] | ||
|- | |- | ||
| 0x7000 || [[ | | 0x7000 || [[#Info Block|Info Block]] | ||
|- | |- | ||
| 0x7001 || [[ | | 0x7001 || [[#Data Block|Data Block]] | ||
|- | |- | ||
| 0x7100 || [[ | | 0x7100 || [[#Channel Info|Channel Info]] | ||
|} | |} |
Latest revision as of 14:38, 20 December 2020
This document is about the format of Binary CTR Wave files (BCWAV). The structure is very similar to Microsoft's Wave file.
Overview
Microsoft's WAV structure is RIFF Header which defines the data inside which is WAVE, then the media player expects a "fmt " chunk and a "data" chunk. Nintendo's format uses a CWAV header (no need for a general structure for media, only wave), which points to an INFO struct (the equivalent to fmt) and a DATA struct (the equivalent to data).
Header
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Magic (CWAV) |
0x004 | 2 | Endianness (0xFEFF = little, 0xFFFE = big) |
0x006 | 2 | Header Size (0x40 due to Info Block alignment) |
0x008 | 4 | Version (0x02010000) |
0x00C | 4 | File Size |
0x010 | 2 | Number of Blocks (2) |
0x012 | 2 | Reserved |
0x014 | 12 | Info Block Sized Reference (Offset relative to start of file) |
0x020 | 12 | Data Block Sized Reference (Offset relative to start of file) |
Block Header
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Magic |
0x004 | 4 | Size |
Block Types
MAGIC | TYPE |
---|---|
INFO | Info Block |
DATA | Data Block |
Info Block
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 8 | Block Header |
0x008 | 1 | Encoding |
0x009 | 1 | Loop (0 = don't loop, 1 = loop) |
0x00A | 2 | Padding |
0x00C | 4 | Sample Rate |
0x010 | 4 | Loop Start Frame |
0x014 | 4 | Loop End Frame |
0x018 | 4 | Reserved |
0x01C | X | Channel Info Reference Table |
X | X | Channel Info Entries |
If encoding is DSP ADPCM:
OFFSET | SIZE | DESCRIPTION |
---|---|---|
X | X | DSP ADPCM Info Entries |
If encoding is IMA ADPCM:
OFFSET | SIZE | DESCRIPTION |
---|---|---|
X | X | IMA ADPCM Info Entries |
The info block is aligned to 0x20 bytes.
Encoding
VALUE | DESCRIPTION |
---|---|
0 | PCM8 |
1 | PCM16 |
2 | DSP ADPCM |
3 | IMA ADPCM |
Channel Info
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 8 | Samples Reference (Offset relative to Data Block Data field) |
0x008 | 8 | ADPCM Info Reference (Offset relative to Samples Reference field) |
0x010 | 4 | Reserved |
DSP ADPCM Info
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 32 | Param |
0x020 | 6 | Context |
0x026 | 6 | Loop Context |
0x02C | 2 | Padding |
DSP ADPCM Param
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 32 | 16-bit Coefficients |
DSP ADPCM Context
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 1 | 4-bit Predictor + 4-bit Scale |
0x001 | 1 | Reserved |
0x002 | 2 | Previous Sample |
0x004 | 2 | Second Previous Sample |
IMA ADPCM Info
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Context |
0x004 | 4 | Loop Context |
IMA ADPCM Context
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 2 | Data |
0x002 | 1 | Table Index |
0x003 | 1 | Padding |
Data Block
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 8 | Block Header |
0x008 | Block Header Size Value - 8 | Data |
The data block is aligned to 0x20 bytes, as well as the data field's actual sample data.
Reference Table
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Count |
0x004 | Count * 8 | References (Offsets relative to Count field) |
Sized Reference
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 8 | Reference |
0x008 | 4 | Size |
Reference
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 2 | Type ID |
0x002 | 2 | Padding |
0x004 | 4 | Offset ("null" = 0xFFFFFFFF) |
Reference Types
ID | TYPE |
---|---|
0x0300 | DSP ADPCM Info |
0x0301 | IMA ADPCM Info |
0x1F00 | Sample Data |
0x7000 | Info Block |
0x7001 | Data Block |
0x7100 | Channel Info |