Difference between revisions of "BCWAV"
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).) |
||
(13 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 || [[#IMA ADPCM Info|IMA ADPCM Info]] | ||
|- | |- | ||
− | | | + | | 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 13: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[edit]
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[edit]
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[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Magic |
0x004 | 4 | Size |
Block Types[edit]
MAGIC | TYPE |
---|---|
INFO | Info Block |
DATA | Data Block |
Info Block[edit]
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[edit]
VALUE | DESCRIPTION |
---|---|
0 | PCM8 |
1 | PCM16 |
2 | DSP ADPCM |
3 | IMA ADPCM |
Channel Info[edit]
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[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 32 | Param |
0x020 | 6 | Context |
0x026 | 6 | Loop Context |
0x02C | 2 | Padding |
DSP ADPCM Param[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 32 | 16-bit Coefficients |
DSP ADPCM Context[edit]
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[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Context |
0x004 | 4 | Loop Context |
IMA ADPCM Context[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 2 | Data |
0x002 | 1 | Table Index |
0x003 | 1 | Padding |
Data Block[edit]
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[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 4 | Count |
0x004 | Count * 8 | References (Offsets relative to Count field) |
Sized Reference[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 8 | Reference |
0x008 | 4 | Size |
Reference[edit]
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x000 | 2 | Type ID |
0x002 | 2 | Padding |
0x004 | 4 | Offset ("null" = 0xFFFFFFFF) |
Reference Types[edit]
ID | TYPE |
---|---|
0x0300 | DSP ADPCM Info |
0x0301 | IMA ADPCM Info |
0x1F00 | Sample Data |
0x7000 | Info Block |
0x7001 | Data Block |
0x7100 | Channel Info |