BCSAR: Difference between revisions
No edit summary |
m BCSAR View added to the Tools |
||
(8 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
The BCSAR (Binary CTR Sound ARchive) format is the 3DS's equivalent of the Wii's BRSAR format. They're not the same structures, though, but they do have the same purpose. | |||
BCSAR are located in the RomFS, this is usually stored under "romfs:/sound/<name>.bcsar". This contains various audio formats, such as CSTM, CWSD, CSEQ, and CWAV. | |||
BCSAR are located in the RomFS, this is usually stored under "romfs:/sound/<name>.bcsar". This contains various audio formats, such as CSTM, CWSD, and CWAV. | |||
== BCSAR Header == | == BCSAR Header == | ||
Line 40: | Line 37: | ||
| 0x14 | | 0x14 | ||
| 0x4 | | 0x4 | ||
| | | STRG partition reference ID? (Always 0x2000) | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
Line 52: | Line 49: | ||
| 0x20 | | 0x20 | ||
| 0x4 | | 0x4 | ||
| | | INFO partition reference ID? (Always 0x2001) | ||
|- | |- | ||
| 0x24 | | 0x24 | ||
Line 61: | Line 58: | ||
| 0x4 | | 0x4 | ||
| Length of INFO partition | | Length of INFO partition | ||
|- | |||
| 0x2C | |||
| 0x4 | |||
| Main FILE partition reference ID? (Always 0x2002) | |||
|- | |- | ||
| 0x30 | | 0x30 | ||
Line 185: | Line 186: | ||
| 0x0 | | 0x0 | ||
| 0x2 | | 0x2 | ||
| | | Nonzero if contains data | ||
|- | |- | ||
| 0x2 | | 0x2 | ||
| 0x2 | | 0x2 | ||
| | | Bit test condition (index = (this >> 3), bit = (~this & 7)), -1 if unused | ||
|- | |- | ||
| 0x4 | | 0x4 | ||
| 0x4 | | 0x4 | ||
| | | Fail condition leaf index (-1 if unused) | ||
|- | |- | ||
| 0x8 | | 0x8 | ||
| 0x4 | | 0x4 | ||
| | | Success condition leaf index (-1 if unused) | ||
|- | |- | ||
| 0xC | | 0xC | ||
| | | 0x4 | ||
| | | String lookup table index (-1 if unused) | ||
|- | |||
| 0x10 | |||
| 0x3 | |||
| 3-byte Resource ID, Little Endian (-1 if unused) | |||
|- | |||
| 0x13 | |||
| 0x1 | |||
| Resource type (01=sound, 02=sound list, 03=sound bank, 04=sound player name?, 06=sound group, FF=unused) | |||
|- | |- | ||
|} | |} | ||
Line 210: | Line 219: | ||
For now I only know some information in the header for this partition, but I'm working on figuring the rest out. | For now I only know some information in the header for this partition, but I'm working on figuring the rest out. | ||
==== Header ==== | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 227: | Line 238: | ||
| 0x8 | | 0x8 | ||
| 0x4 | | 0x4 | ||
| | | Audio Table Reference ID (0x2100) | ||
|- | |- | ||
| 0xC | | 0xC | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to the Audio Table | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
| 0x4 | | 0x4 | ||
| | | Set Table Reference ID (0x2104) | ||
|- | |- | ||
| 0x14 | | 0x14 | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to the Set Table | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
| 0x4 | | 0x4 | ||
| | | Bank Table Reference ID (0x2101) | ||
|- | |- | ||
| 0x1C | | 0x1C | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to the Bank Table | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
| 0x4 | | 0x4 | ||
| | | WAV Archive Table Reference ID (0x2103) | ||
|- | |- | ||
| 0x24 | | 0x24 | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to the WAV Archive Table | ||
|- | |- | ||
| 0x28 | | 0x28 | ||
| 0x4 | | 0x4 | ||
| | | Group Table Reference ID (0x2105) | ||
|- | |- | ||
| 0x2C | | 0x2C | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to the Group Table | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| 0x4 | | 0x4 | ||
| | | Player Table Reference ID (0x2102) | ||
|- | |- | ||
| 0x34 | | 0x34 | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to Player Table | ||
|- | |- | ||
| 0x38 | | 0x38 | ||
| 0x4 | | 0x4 | ||
| | | FILE Table Reference ID (0x2106) | ||
|- | |- | ||
| 0x3C | | 0x3C | ||
| 0x4 | | 0x4 | ||
| This + 8 points to | | This + 8 points to the FILE Table | ||
|- | |- | ||
| 0x40 | | 0x40 | ||
| 0x4 | | 0x4 | ||
| Unknown | | Unknown Table Reference ID (0x220B) | ||
|- | |- | ||
| 0x44 | | 0x44 | ||
| 0x4 | | 0x4 | ||
| This + 8 points to unknown | | This + 8 points to unknown | ||
|- | |||
|} | |||
==== Blocks ==== | |||
Every offset in the header points to data similar to this: | |||
* 4byte length | |||
* length array of the below struct | |||
** u32 type | |||
** u32 offset relative to the address of the length field (beginning of the block) | |||
The data the offset points to is dependent on the type of the above struct: | |||
===== 0x2200 ===== | |||
{| class="wikitable" border="1" | |||
|- | |||
! OFFSET | |||
! SIZE | |||
! DESCRIPTION | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0x4 | |||
| 0x4 | |||
| Sound player ID | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Type of the extended info | |||
|- | |||
| 0x10 | |||
| 0x4 | |||
| Offset to extended info *relative to the beginning of this struct* | |||
|- | |||
| 0x14 | |||
| ??? | |||
| Unknown... | |||
|- | |||
|} | |||
===== 0x2204 ===== | |||
{| class="wikitable" border="1" | |||
|- | |||
! OFFSET | |||
! SIZE | |||
! DESCRIPTION | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| First Sound ID in this sequence set | |||
|- | |||
| 0x4 | |||
| 0x4 | |||
| Last Sound ID in this sequence set | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| Type of the extended info | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Offset to extended info *relative to the beginning of this struct* | |||
|- | |||
| 0x10 | |||
| 0x4 | |||
| Type of the extended info | |||
|- | |||
| 0x14 | |||
| 0x4 | |||
| Offset to extended info *relative to the beginning of this struct* | |||
|- | |||
| 0x18 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0x1C | |||
| 0x4 | |||
| Unknown | |||
|- | |||
|} | |||
===== 0x2206 ===== | |||
{| class="wikitable" border="1" | |||
|- | |||
! OFFSET | |||
! SIZE | |||
! DESCRIPTION | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0x4 | |||
| 0x4 | |||
| Type of the extended info | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| Offset to extended info *relative to the beginning of this struct* | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0x10 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
|} | |||
===== Table IDs ===== | |||
{| class="wikitable" border="1" | |||
|- | |||
! ID | |||
! NAME | |||
|- | |||
| 0x2200 | |||
| Audio Table | |||
|- | |||
| 0x2204 | |||
| Set Table | |||
|- | |||
| 0x2206 | |||
| Bank Table | |||
|- | |||
| 0x2207 | |||
| WAV Archive Table | |||
|- | |||
| 0x2208 | |||
| Group Table | |||
|- | |||
| 0x2208 | |||
| Player Table | |||
|- | |||
| 0x220A | |||
| FILE Table | |||
|- | |- | ||
|} | |} | ||
Line 309: | Line 466: | ||
| Length of FILE partition (also in CSAR header) | | Length of FILE partition (also in CSAR header) | ||
|- | |- | ||
| 0x8 | |||
| 0x24 | |||
| Padding | |||
|} | |} | ||
Line 319: | Line 479: | ||
== Tools == | == Tools == | ||
* vgmtoolbox's Advanced Cutter/Offset Finder tool can extract BCWAVs without filenames | * vgmtoolbox's Advanced Cutter/Offset Finder tool can extract BCWAVs without filenames | ||
* [https://github.com/soneek/3DSUSoundArchiveTool 3DSUSoundArchiveTool] reference implementation of CSAR extraction | |||
* [https://github.com/thane98/BCSAR-View BCSAR View] | |||
* [https://github.com/Gota7/Citric-Composer Citric Composer] | |||
[[Category:File formats]] |