Difference between revisions of "BCWAV"

From 3dbrew
Jump to navigation Jump to search
Line 24: Line 24:
 
| 0x000 || 4 || Magic (CWAV)
 
| 0x000 || 4 || Magic (CWAV)
 
|-
 
|-
| 0x004 || 2 || Endianess (0xFEFF=LE / 0xFFFE=BE)
+
| 0x004 || 2 || Endianness (0xFEFF = little, 0xFFFE = big)
 
|-
 
|-
| 0x006 || 2 || Struct Length
+
| 0x006 || 2 || Header Size (0x40)
 
|-
 
|-
| 0x008 || 4 || Unknown 0
+
| 0x008 || 4 || Version (0x02010000)
 
|-
 
|-
| 0x00C || 4 || File's size
+
| 0x00C || 4 || File Size
 
|-
 
|-
| 0x010 || 4 || Number of chunks (= 2 (INFO & DATA))
+
| 0x010 || 2 || Number of Blocks (2)
 
|-
 
|-
| 0x014 || 4 || Info Chunk Flags (0x7000)
+
| 0x012 || 2 || Reserved
 
|-
 
|-
| 0x018 || 4 || Info Chunk Offset
+
| 0x014 || 12 || [[BCWAV#Info Block|Info Block]] [[BCWAV#Sized Reference|Sized Reference]] (Offset relative to start of file)
 
|-
 
|-
| 0x01C || 4 || Info Chunk Length
+
| 0x020 || 12 || [[BCWAV#Data Block|Data Block]] [[BCWAV#Sized Reference|Sized Reference]] (Offset relative to start of file)
 
|-
 
|-
| 0x020 || 4 || Data Chunk Flags (0x7000)
+
| 0x02C || 20 || Padding
 +
|}
 +
 
 +
=== Block Header ===
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! OFFSET !! SIZE !!  DESCRIPTION
 +
|-
 +
| 0x000 || 4 || Magic
 +
|-
 +
| 0x004 || 4 || Size
 +
|}
 +
 
 +
==== Block Types ====
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x024 || 4 || Data Chunk Offset
+
! MAGIC !! TYPE
 
|-
 
|-
| 0x028 || 4 || Data Chunk Length
+
| INFO || [[BCWAV#Info Block|Info Block]]
 
|-
 
|-
| 0x02C || 0x20 || Reserved (for more chunks offsets)
+
| DATA || [[BCWAV#Data Block|Data Block]]
 
|}
 
|}
  
=== INFO Header ===
+
=== Info Block ===
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 55: Line 71:
 
! OFFSET !! SIZE !!  DESCRIPTION
 
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x000 || 4 || Magic (INFO)
+
| 0x000 || 8 || [[BCWAV#Block Header|Block Header]]
 
|-
 
|-
| 0x004 || 4 || Length
+
| 0x008 || 1 || [[BCWAV#Encoding|Encoding]]
 
|-
 
|-
| 0x008 || 4 || Type (must be less than 4)
+
| 0x009 || 1 || Loop (0 = don't loop, 1 = loop)
 +
|-
 +
| 0x00A || 2 || Padding
 
|-
 
|-
 
| 0x00C || 4 || Sample Rate
 
| 0x00C || 4 || Sample Rate
 
|-
 
|-
| 0x010 || 4 || Unknown 1
+
| 0x010 || 4 || Loop Start Frame
 +
|-
 +
| 0x014 || 4 || Loop End Frame
 +
|-
 +
| 0x018 || 4 || Reserved
 +
|-
 +
| 0x01C || 4 + Count * 8 || [[BCWAV#Channel Info|Channel Info]] [[BCWAV#Reference Table|Reference Table]]
 +
|}
 +
 
 +
=== Data Block ===
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! OFFSET !! SIZE !!  DESCRIPTION
 +
|-
 +
| 0x000 || 8 || [[BCWAV#Block Header|Block Header]]
 +
|-
 +
| 0x008 || [[BCWAV#Block Header|Block Header]] Size - 8 || Data
 +
|}
 +
 
 +
=== Encoding ===
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! VALUE !! DESCRIPTION
 +
|-
 +
| 0 || PCM8
 +
|-
 +
| 1 || PCM16
 +
|-
 +
| 2 || DSP ADPCM
 +
|-
 +
| 3 || IMA ADPCM
 +
|}
 +
 
 +
=== Channel Info ===
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! OFFSET !! SIZE !!  DESCRIPTION
 +
|-
 +
| 0x000 || 8 || Samples [[BCWAV#Reference|Reference]] (Offset relative to [[BCWAV#Data Block|Data Block]] Data field)
 +
|-
 +
| 0x008 || 8 || ADPCM Info [[BCWAV#Reference|Reference]]  (Offset relative to [[BCWAV#Channel Info|Channel Info]] start)
 +
|-
 +
| 0x010 || 4 || Reserved
 +
|}
 +
 
 +
=== DSP ADPCM Info ===
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! OFFSET !! SIZE !!  DESCRIPTION
 +
|-
 +
| 0x000 || 32 || [[BCWAV#DSP ADPCM Param|Param]]
 +
|-
 +
| 0x020 || 6 || [[BCWAV#DSP ADPCM Context|Context]]
 +
|-
 +
| 0x026 || 6 || Loop [[BCWAV#DSP ADPCM Context|Context]]
 +
|}
 +
 
 +
=== DSP ADPCM Param ===
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x014 || 4 || Total samples
+
| 0x000 || 32 || 16-bit Coefficients
 +
|}
 +
 
 +
=== DSP ADPCM Context ===
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x018 || 4 || Unknown 2
+
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x01C || 4 || Total Channels
+
| 0x000 || 1 || 4-bit Predictor + 4-bit Scale
 
|-
 
|-
| 0x020 || X || The Channels' Data Pointers
+
| 0x001 || 1 || Reserved
 
|-
 
|-
| X || X || The Channels' Data
+
| 0x002 || 2 || Previous Sample
 +
|-
 +
| 0x004 || 2 || Second Previous Sample
 
|}
 
|}
  
  * The channels data pointers are pointers to another struct that points to the actual data (this stucture has flags as well)
+
=== IMA ADPCM Info ===
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 82: Line 172:
 
! OFFSET !! SIZE !!  DESCRIPTION
 
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x000 || 4 || Flags
+
| 0x000 || 4 || [[BCWAV#IMA ADPCM Context|Context]]
 
|-
 
|-
| 0x004 || 4 || Offset (from 0x5C, INFO's channels field)
+
| 0x004 || 4 || Loop [[BCWAV#IMA ADPCM Context|Context]]
 
|}
 
|}
  
  * The channels data are pointers to the actual data (this stucture has flags as well)
+
=== IMA ADPCM Context ===
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 93: Line 183:
 
! OFFSET !! SIZE !!  DESCRIPTION
 
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x000 || 4 || Flags
+
| 0x000 || 2 || Data
 +
|-
 +
| 0x002 || 1 || Table Index
 +
|-
 +
| 0x003 || 1 || Padding
 +
|}
 +
 
 +
=== Reference Table ===
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x004 || 4 || Offset (inside the DATA block data)
+
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x008 || 4 || FFs (0xFFFFFFFF)
+
| 0x000 || 4 || Count
 
|-
 
|-
| 0x00C || 4 || Padding (Zero)
+
| 0x004 || Count * 8 || [[BCWAV#Reference|References]] (Offsets relative to Count field)
 
|}
 
|}
  
 +
=== Sized Reference ===
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! OFFSET !! SIZE !!  DESCRIPTION
 +
|-
 +
| 0x000 || 8 || [[BCWAV#Reference|Reference]]
 +
|-
 +
| 0x008 || 4 || Size
 +
|}
  
=== DATA Header ===
+
=== Reference ===
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 109: Line 218:
 
! OFFSET !! SIZE !!  DESCRIPTION
 
! OFFSET !! SIZE !!  DESCRIPTION
 
|-
 
|-
| 0x000 || 4 || Magic (DATA)
+
| 0x000 || 2 || Type ID
 +
|-
 +
| 0x002 || 2 || Padding
 +
|-
 +
| 0x004 || 4 || Offset
 +
|}
 +
 
 +
==== Reference Types ====
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! ID !! TYPE
 +
|-
 +
| 0x0300 || [[BCWAV#DSP ADPCM Info|DSP ADPCM Info]]
 +
|-
 +
| 0x0301 || [[BCWAV#IMA ADPCM Info|IMA ADPCM Info]]
 +
|-
 +
| 0x7000 || [[BCWAV#Info Block|Info Block]]
 +
|-
 +
| 0x7001 || [[BCWAV#Data Block|Data Block]]
 
|-
 
|-
| 0x004 || 4 || Length
+
| 0x7100 || [[BCWAV#Channel Info|Channel Info]]
 
|}
 
|}

Revision as of 02:45, 26 November 2015

This document is about the format of Banner's CTR Wave files (BCWAV).

The structure is very similar to Microsoft's Wave file.

Banner CWAV total channels must be 2, and the length of the audio in seconds must be 3 seconds or less.

Overview

Microsoft's Wave structure is RIFF Header which defines the data inside which is WAVE.

then the media player expects "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)
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)
0x02C 20 Padding

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 4 + Count * 8 Channel Info Reference Table

Data Block

OFFSET SIZE DESCRIPTION
0x000 8 Block Header
0x008 Block Header Size - 8 Data

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 Channel Info start)
0x010 4 Reserved

DSP ADPCM Info

OFFSET SIZE DESCRIPTION
0x000 32 Param
0x020 6 Context
0x026 6 Loop Context

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

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

Reference Types

ID TYPE
0x0300 DSP ADPCM Info
0x0301 IMA ADPCM Info
0x7000 Info Block
0x7001 Data Block
0x7100 Channel Info