Most people that hang around DS hacking eventually come across audio hacking which has been covered elsewhere but I feel like covering it again and maybe doing a bit more research into various things some of which was done as I was typing this up. As a rule of thumb everything that is not SDAT is a simple format, a known format, a wrapper of some form for a common format or something just wrapped around plain wave- to my knowledge there are no alternative tracker/sequencer formats with all the alt formats being some form of straight digitised wave form (although things can be layered across the various channels) save perhaps some of the things the music games do and maybe disgaea depending on how you look at it.
I am not intending to go into music games and their formats with the aim of custom songs in those at this point but if it is there I will quite happily fiddle with it.
To this end a quick overview of the state of things.
SDAT
The DS SDK format and one used by the vast majority of games however the games that do not use it with the possible exception of el tigre make my mule are noteworthy games in the DS library so it might well be worth the time having a look at the others. SDAT however is the container file for it all (occasionally you can see files outside them)
It is a full audio format with three types of audio playback supported although there are helper files.
SSEQ- analogous somewhat to midi and/or tracker formats
SWAR (SWAV)- small PCM or ADPCM samples that either stand alone or are used as instruments for SSEQ.
STRM- usually some PCM or ADPCM and can go right to full audio tracks (some of the Tony Hawk games had them including files outside the SDAT).
The first hacks to it were simple swaps to lower file sizes when people were still using GBA era devices with as little as 16 megabytes of space on them (more often 32).
Later some were sliced up and they kept working.
After that came undubs where usually Japanese audio in the form of a whole SDAT file was stuck in a US or EU rom and it usually made the game have the Japanese audio. As localisation tends to just change things across most of the time this worked, when it did not work it was usually the fault of the rom packing tool (ndstool which some use standalone but more use with DSLazy or DSBuff is far from perfect for commercial roms) but the occasional rom does have a big change (megaman ZX and possibly Spectral Genesis)
Around the same time it was discovered that Zoids Saga had an SMAP file in it- SMAP is a sort of info sheet generated by Nintendo's tools (although other programs can now generate them) which led to the whole SDAT format being reverse engineered. Occasionally other files like SADL are seen alongside the SDAT file.
http://www.romhacking.net/docs/469/
http://kiwi.ds.googlepages.com/sdat.html
http://gbatemp.net/t253947-nintendo-sdat-specifications?view=findpost&p=3154732
At first this mainly led to ripping the audio tracks (more on that in a moment) but later it allowed repointing hacks
http://gbatemp.net/index.php?showtopic=122534&hl=
Later injection happened
http://jul.rustedlogic.net/thread.php?id=7518
Alongside this the ability to generate SSEQ files happened
http://sites.google.com/site/kiwids/ (see midi2sseq)
More recently we got another one
http://gbatemp.net/t301382-ds-code-sseq-player-and-new-mid-to-sseq-converter
These days STRM and SWAV files can also be made and injected.
Also with SSEQ being a proper tracker format (or close enough) you can edit the commands to change the audio however you will which culminates in the likes of
http://gbatemp.net/t305204-nintendo-ds-music-hacking-looping-included-fully-explained
http://pkmnhackersonline.com/romhacking/25/DS Music Hacking [LOOPING INCLUDED] (an older version)
Tutorials covering some of the concepts with editing commands (mainly looping in SSEQ because several people like doing that) but if you know what goes you can probably do it by hand far more easily.
Repacking a file into SDAT can supposedly be done with http://filetrip.net/f5658-NDS-Editor-0-1.html but that is a long shot so it is usually advised that you rebuild by hand or modify an existing file to accommodate you new file (pointers, section lengths and file lengths need changing)
Ripping can be done in several ways
The crudest is a line out from a DS into the line in/mic of your soundcard
The second uses an emulator and a loopback option to grab sound (or maybe the emulator has sound grab abilities but it is the same idea)
As running roms is no great issue these hacks can be helped along with audio hacks (repointing stuff) to either mute SFX and such or get end game tracks to play early on/at a quiet point. Equally with an emulator you can drop channels to leave whatever you want to play (most of the time it will be aimed at a given channel all the time).
These two abilities hold for all audio ripping regardless of format.
After this we have conversion which comes in one of two types
SSEQ2midi style- these tools attempt to take sseq and approximate them to midi instruments.
The aforementioned SSEQ2midi can do it
http://sites.google.com/site/kiwids
http://code.google.com/p/loveemu/downloads/list (also includes some STRM and SWAV stuff)
Various flavours of this exist but most are just minor bugfixes on the initial thing. It should be noted that Monster Tale ( http://gbatemp.net/index.php?showtopic=292661 ) has confused these tools so some work might need to be done there.
NDSsndext (can also do the STRM and SWAV formats)
http://filetrip.net/nds-downloads/utilities/download-nds-sound-extractor-0-4-f28818.html Originally from http://nintendon.s6.xrea.com/ but downloads of it no longer available there.
VGMtrans
http://gbatemp.net/threads/new-vgmtrans-github-and-loveemu.354869/
It does a line in straight SSEQ to midi but it can also generate DLS files which can be combined
Crystaltile2 supposedly has some playback but it is broken. It does however have a wonderful parser and information grabbing option
http://filetrip.net/f23649-CrystalTile2-2010-09-06.html
After this you have proper emulation.
VGMtoolbox combined with snakemeat and caitsith2's plugins/rip kits (might have to search a bit for those).
http://sourceforge.net/projects/vgmtoolbox/files/vgmtoolbox/
Much like the nsf format and similar formats this emulates the audio so barring a few tiny quirks with the decoder libraries it is about 1:1 http://www.zophar.net/utilities/2sf/vio2sf.html has a foobar and co compatible decoder (which can then spit out a standard wave file to be used as appropriate).
That is pretty much SDAT hacking covered, some stuff is still to discover and simple graphical tools are not as common as they might be but SDAT hacking is pretty mature. It is by no means a complete tools list either- several other nice tools exist here.
pkg packed files.
possibly just a packaged format- not seen so often for SDAT (indeed most packaged files kick SDAT out of the package and have it fly solo- see early phoenix wright and tony hawk games).
Examples being El Tigre: Make my mule. Doing a strings search fo the ET.pkg there are some mentions of WAVE and SWAV
A 32 bit flip will need to be applied if you are going to down this path.
The pkg format appears to have a header (containing a lot of files by the looks of things)
The initial 48 byte header has some stuff in it but following that is a file allocation table of sorts
Entries are 52 bytes long
Starts with name in ASCII (unsure as to longest possible "wireless_signal_strength.spr" being a longer example)
Next is file number (counts up in hex)
Next is possibly a flag (0100 being the most common but 0000 appearing a lot) Compression was not checked for but given the next two it could well be
Next is some form of file size (probably decompressed)
Next is another file size, 0000 flag entries are usually the same but the 0100 stuff is usually smaller (compressed size perhaps)- taking the location value from the previous one did have a tendency to generate this number but not enough were tested to see about padding.
This is followed by the file location
SWAV were not compressed/encrypted (had 0000 flag) and look like a standard one- imported as ADPCM at around 22050Hz into audacity well enough.
wave just looked to be file names (SPX extension like most of the other files). Going off topic str, spr, fnt, txt, swav, scn, xml, csa, lua and dat being the other extensions (whether this is lua the programming language or not is a different matter- it has been seen in puzzle quest before though). Files seem compressed or encrypted though and it is not standard flag at the start of the file stuff not to mention it is not even the sort of half readable stuff you get with LZ (checked XML and txt).
dat format (pending a better name) DSARC FL is the magic stamp in songs.dat msnd is seen in extensions, DSEQ is the magic stamp for the msnd files although DSARC is used elsewhere.
Seen in Disgaea
Alongside this seems to be a .tbl file which might have some good stuff in it.
Curiously DSEQ and SSEQ are seen- 12 times for 13 header entries although it seems song006.msnd ( 0ED000 ) is repeated for whatever reason.
File is 1FAE00 long
Header on the file
16 bytes initially
48 bytes after that for each entry
28 bytes possibly for names (none are very long)
A search for SSEQ (note not the start of each section/file)
0x00000430
0x00031A30
0x0005DC30
0x0008C630
0x000BE430
0x000ED030
0x000FFA30
0x0012FA30
0x00157430
0x00188630
0x001B7230
0x001C9C30
If you prefer a search for DSEQ
0x00000400
0x00031A00
0x0005DC00
0x0008C600
0x000BE400
0x000ED000
0x000FFA00
0x0012FA00
0x00157400
0x00188600
0x001B7200
0x001C9C00
One tweaked header sample
the "song" part may be a name of sorts- several references to Jingle2.msnd are seen in the file.
Pulling song001.msnd from the file and viewing that
Appears to be a header section
At 40 there is data but at 30 there is SSEQ
At 60A0 in the new file there is SNBK
At 6400 there is SWAR
(this seems to hold for other files)
These are the three files needed for complete SSEQ playback,
At 6078 the SSEQ file turns to 00 so that might be some padding/file length.
035c could well be the length of the SBNK (if a 0000 is used to end the file)
0002 B0BC could be the length of the SWAR as a 4 bytes later there comes the Jingle2.msnd "reference" and a bit more data before starting the next file.
00054F60 might be playback help stuff
More fiddling needed. A quick scan of BGM.dat looks like what is known so far is good.
Also voice.dat and se.dat (now having files with the extension .se and .swav with the .swav appearing to correspond to the .se files) hold up. To this end it looks like a rejigged SDAT format. .dat.tbl files appear to grow in size with the amount of files contained within the dat files.
Conventional Wave files.
Used by Electroplankton. Music making games often have odd formats at their heart and Electroplankton has plain wave files as you can generate even with loads of tools. Related to the below format.
BAR format (seemingly package files in this case for wave format)
Brothers in Arms. A very odd game for hackers and pretty much forgotten.
Everything is in "BAR" files with one named sounds.bar
Looking at the other files they start with what could be simple pointers/locations with nothing else
In the sounds.bar there are bunch of "RIFF" which is classic wave file behaviour- http://soundfile.sapp.org/doc/WaveFormat/
Would be pointers line up fairly well although they appear to be offset (not checked how/how much) and there are more amounts of RIFF than pointers.
Still straight extraction gives a apparently straight windows compatible wave file- some orchestral stuff for the tests at 32 bit float 22050Hz (22KHz- fairly standard low grade sampling rate) and mono.
PCM audio.
Used by N+
This is a raw PCM audio format, better audio editors feature raw import (audacity http://audacity.sourceforge.net/ has the ability) and raw export is too troubling either.
ADX/AHX-
An old format seen back on the dreamcast and systems since but appeared on the DS as well. Games have been seen to split the difference between this and SDAT (Ninja Gaiden being a good example).
Used by several games apparently http://www.cri-mw.com/product/adoption/platform/ds.html (note this can also include their video format and their file packing/handling stuff).
First spotted in a basketball game but came to the fore in The World ends with you often referred to as TWEWY. It is pretty much a wrapper format for some MPEG audio of various flavours and several tools are capable of handling conversion to and from not to mention file system hacks are viable.
adx2wav
adh2wav
wav2adx being the main tools here
They can be found with a simple search but some downloads might appear at some point.
http://www.geocities.co.jp/Playtown/2004/dcdev/dcdev.html
DSE audio format.
Home page in Japanese for the library http://www.procyon-studio.co.jp/dse/
Some reverse engineering for the pokemon stuff http://projectpokemon.org/wiki/Digital_Sound_Elements
GBAtemp thread http://gbatemp.net/threads/need-some-help-reversing-the-dse-audio-formats.405139/
Seen in various extensions like .pb and has magic stamps/section stamps like SED SWD and SMD
Seen in Inazuma 11
From the relocalisation project
Our guess as to what goes would be based on some of the magic stamps in the file and the history of DS audio it is likely some form of close to hardware decoding wave/PCM/IMA-ADPCM. If a straight undub did not work try making the file names the same and fiddling there.
It appears to be one of the simplest packing formats on the DS with several things like it
First line is file name
First 14 bytes appear to be size (although flipping them gets a bit odd for really big numbers)
In the second line BC08 flips to 08BC which is the start of a file (0000 in the first line indicates the file starts at the start of the file so that is not much use for reversing).
The next line is 7CD3, looking back for a second you have BC08 C0CA 0100 or more accurately 08BC and 0001 CAC0, adding them rather nicely produces 0001 D37C. This is quite nice in rom hacking*- you saw the rest of the rom where things had 16byte alignment.
*other roms/files like alignment so file start + length does not always equal next file start location.
0001 D37C is where the next file starts.
All names appeared to be filename.S?? so searching for .S yields 852 files. Add one as there is a file called Makefile which is detailed at 66C0 in the .ph file. Odd little files like this can make or break a rom hack so I looked at that.
E875 4D02
translates as
024D75E8
050B long
024D 7AF3 is the end which is rather nicely also the next file still (means things probably did not change as the file went on)
It appears to do as it says on the tin, perhaps not quite as nice as princess maker, zoids saga stuff for sound or some of the other interesting things that have been dug out of roms over the years.
http://pastebin.com/uA6refYY
SAD audio format
Seen in Zombi Daisuki and possibly a few others. Usually sat alongside bin files with the magic stamp SIR0
Pending further research one file list with sizes. Do note the game is quite interesting from a hacker perspective.
BDX
Seen in Daigasso Band brothers (and sequel)
Another music game with a custom format, reverse engineered and tools made to support it
http://www.auby.no/wiki/index.php?title=Band_Brothers_DX#Song_format
http://dshack.wikia.com/wiki/Daigasso!_Band_Bros._series
deufeufeu also did a fair bit of work but it seems a lot of it was lost.
DSB format
Seen in Taiko no Tatsujin at least. One of the few games to combine SDAT and custom stuff.
various magic stamps in the file
DSSB8- 64 bytes followed by 00 0000 hex leading to an ASCII name same as the file name up to 18 hex (00 padded if too short) 0100 0000 next for all files. A file length on occasion but often falls short. 40 and then padded with 00 until the next section for all files.
DSST8- 64 bytes followed by 00 0000 hex leading to an ASCII name same as the file name up to 58 hex (00 padded if too short) alternated between ???? FFFF and 0000 0000 for the 0100 0000 section. ???? was usually quite large F6FF and such with many values repeating. Another length value (slightly smaller than the main one above) and all sort of fairly random stuff to make up the rest.
BNSF (shortly after this it has sdat), perhaps not as long as the ones before it.
Three entries regardless of size- someone mentioned easy and hard modes which could well be it.
Between BNSF and S14 there appear to be 4 bytes given over to a size of some form.
After BNSF there was usually SDAT but some had loop and then SDAT a line (16 bytes) later (many files with jingle in the name although several jingle files without it).
After that came the data but nothing jumped out at me. It was densely packed and did not compress well which is classic digitised wave behaviour although with files ranging from under 10 kilobytes to just shy of 800 kilobytes it could mean several things.
SDFDAT
Seen in Super princess peach so far (another TOSE game causing fun).
http://gbatemp.net/threads/vgmtrans-wont-work-with-super-princess-peach.357428/#post-4824844
An actual custom midi style and wave sporting format. More on the thread linked, fairly basic archive format breaking down into what looks to be self contained song/audio packages.
That over onto the thread. Feel free to add things if you want or point us at other interesting sound related formats or troublesome games.
OGG/OGM
A common, patent free and open source, media format. Seen very often in PC games but no stranger to consoles either, handhelds are less common but an example for the DS can be seen in " WWE SmackDown vs Raw 2010 featuring ECW".
http://gbatemp.net/threads/the-various-audio-formats-of-the-ds.305167/page-2#post-4250023 has more.
MIDI
A common, but so well liked among audio fans, sequenced format. Found in a few games but they might equally be developer leftovers.
Custom XM
Seen in a DSiware game. At present it was mainly reconstructed from running data rather than standalone decode.
https://gbatemp.net/threads/dsiware-problem.559964/
I am not intending to go into music games and their formats with the aim of custom songs in those at this point but if it is there I will quite happily fiddle with it.
To this end a quick overview of the state of things.
SDAT
The DS SDK format and one used by the vast majority of games however the games that do not use it with the possible exception of el tigre make my mule are noteworthy games in the DS library so it might well be worth the time having a look at the others. SDAT however is the container file for it all (occasionally you can see files outside them)
It is a full audio format with three types of audio playback supported although there are helper files.
SSEQ- analogous somewhat to midi and/or tracker formats
SWAR (SWAV)- small PCM or ADPCM samples that either stand alone or are used as instruments for SSEQ.
STRM- usually some PCM or ADPCM and can go right to full audio tracks (some of the Tony Hawk games had them including files outside the SDAT).
The first hacks to it were simple swaps to lower file sizes when people were still using GBA era devices with as little as 16 megabytes of space on them (more often 32).
Later some were sliced up and they kept working.
After that came undubs where usually Japanese audio in the form of a whole SDAT file was stuck in a US or EU rom and it usually made the game have the Japanese audio. As localisation tends to just change things across most of the time this worked, when it did not work it was usually the fault of the rom packing tool (ndstool which some use standalone but more use with DSLazy or DSBuff is far from perfect for commercial roms) but the occasional rom does have a big change (megaman ZX and possibly Spectral Genesis)
Around the same time it was discovered that Zoids Saga had an SMAP file in it- SMAP is a sort of info sheet generated by Nintendo's tools (although other programs can now generate them) which led to the whole SDAT format being reverse engineered. Occasionally other files like SADL are seen alongside the SDAT file.
http://www.romhacking.net/docs/469/
http://kiwi.ds.googlepages.com/sdat.html
http://gbatemp.net/t253947-nintendo-sdat-specifications?view=findpost&p=3154732
At first this mainly led to ripping the audio tracks (more on that in a moment) but later it allowed repointing hacks
http://gbatemp.net/index.php?showtopic=122534&hl=
Later injection happened
http://jul.rustedlogic.net/thread.php?id=7518
Alongside this the ability to generate SSEQ files happened
http://sites.google.com/site/kiwids/ (see midi2sseq)
More recently we got another one
http://gbatemp.net/t301382-ds-code-sseq-player-and-new-mid-to-sseq-converter
These days STRM and SWAV files can also be made and injected.
Also with SSEQ being a proper tracker format (or close enough) you can edit the commands to change the audio however you will which culminates in the likes of
http://gbatemp.net/t305204-nintendo-ds-music-hacking-looping-included-fully-explained
http://pkmnhackersonline.com/romhacking/25/DS Music Hacking [LOOPING INCLUDED] (an older version)
Tutorials covering some of the concepts with editing commands (mainly looping in SSEQ because several people like doing that) but if you know what goes you can probably do it by hand far more easily.
Repacking a file into SDAT can supposedly be done with http://filetrip.net/f5658-NDS-Editor-0-1.html but that is a long shot so it is usually advised that you rebuild by hand or modify an existing file to accommodate you new file (pointers, section lengths and file lengths need changing)
Ripping can be done in several ways
The crudest is a line out from a DS into the line in/mic of your soundcard
The second uses an emulator and a loopback option to grab sound (or maybe the emulator has sound grab abilities but it is the same idea)
As running roms is no great issue these hacks can be helped along with audio hacks (repointing stuff) to either mute SFX and such or get end game tracks to play early on/at a quiet point. Equally with an emulator you can drop channels to leave whatever you want to play (most of the time it will be aimed at a given channel all the time).
These two abilities hold for all audio ripping regardless of format.
After this we have conversion which comes in one of two types
SSEQ2midi style- these tools attempt to take sseq and approximate them to midi instruments.
The aforementioned SSEQ2midi can do it
http://sites.google.com/site/kiwids
http://code.google.com/p/loveemu/downloads/list (also includes some STRM and SWAV stuff)
Various flavours of this exist but most are just minor bugfixes on the initial thing. It should be noted that Monster Tale ( http://gbatemp.net/index.php?showtopic=292661 ) has confused these tools so some work might need to be done there.
NDSsndext (can also do the STRM and SWAV formats)
http://filetrip.net/nds-downloads/utilities/download-nds-sound-extractor-0-4-f28818.html Originally from http://nintendon.s6.xrea.com/ but downloads of it no longer available there.
VGMtrans
http://gbatemp.net/threads/new-vgmtrans-github-and-loveemu.354869/
It does a line in straight SSEQ to midi but it can also generate DLS files which can be combined
Crystaltile2 supposedly has some playback but it is broken. It does however have a wonderful parser and information grabbing option
http://filetrip.net/f23649-CrystalTile2-2010-09-06.html
After this you have proper emulation.
VGMtoolbox combined with snakemeat and caitsith2's plugins/rip kits (might have to search a bit for those).
http://sourceforge.net/projects/vgmtoolbox/files/vgmtoolbox/
Much like the nsf format and similar formats this emulates the audio so barring a few tiny quirks with the decoder libraries it is about 1:1 http://www.zophar.net/utilities/2sf/vio2sf.html has a foobar and co compatible decoder (which can then spit out a standard wave file to be used as appropriate).
That is pretty much SDAT hacking covered, some stuff is still to discover and simple graphical tools are not as common as they might be but SDAT hacking is pretty mature. It is by no means a complete tools list either- several other nice tools exist here.
pkg packed files.
possibly just a packaged format- not seen so often for SDAT (indeed most packaged files kick SDAT out of the package and have it fly solo- see early phoenix wright and tony hawk games).
Examples being El Tigre: Make my mule. Doing a strings search fo the ET.pkg there are some mentions of WAVE and SWAV
A 32 bit flip will need to be applied if you are going to down this path.
The pkg format appears to have a header (containing a lot of files by the looks of things)
The initial 48 byte header has some stuff in it but following that is a file allocation table of sorts
Entries are 52 bytes long
Starts with name in ASCII (unsure as to longest possible "wireless_signal_strength.spr" being a longer example)
Next is file number (counts up in hex)
Next is possibly a flag (0100 being the most common but 0000 appearing a lot) Compression was not checked for but given the next two it could well be
Next is some form of file size (probably decompressed)
Next is another file size, 0000 flag entries are usually the same but the 0100 stuff is usually smaller (compressed size perhaps)- taking the location value from the previous one did have a tendency to generate this number but not enough were tested to see about padding.
This is followed by the file location
SWAV were not compressed/encrypted (had 0000 flag) and look like a standard one- imported as ADPCM at around 22050Hz into audacity well enough.
wave just looked to be file names (SPX extension like most of the other files). Going off topic str, spr, fnt, txt, swav, scn, xml, csa, lua and dat being the other extensions (whether this is lua the programming language or not is a different matter- it has been seen in puzzle quest before though). Files seem compressed or encrypted though and it is not standard flag at the start of the file stuff not to mention it is not even the sort of half readable stuff you get with LZ (checked XML and txt).
dat format (pending a better name) DSARC FL is the magic stamp in songs.dat msnd is seen in extensions, DSEQ is the magic stamp for the msnd files although DSARC is used elsewhere.
Seen in Disgaea
Alongside this seems to be a .tbl file which might have some good stuff in it.
Curiously DSEQ and SSEQ are seen- 12 times for 13 header entries although it seems song006.msnd ( 0ED000 ) is repeated for whatever reason.
File is 1FAE00 long
Header on the file
16 bytes initially
Code:
00000000 4453 4152 4320 464C 0D00 0000 0100 0000 DSARC FL........
48 bytes after that for each entry
28 bytes possibly for names (none are very long)
A search for SSEQ (note not the start of each section/file)
0x00000430
0x00031A30
0x0005DC30
0x0008C630
0x000BE430
0x000ED030
0x000FFA30
0x0012FA30
0x00157430
0x00188630
0x001B7230
0x001C9C30
If you prefer a search for DSEQ
0x00000400
0x00031A00
0x0005DC00
0x0008C600
0x000BE400
0x000ED000
0x000FFA00
0x0012FA00
0x00157400
0x00188600
0x001B7200
0x001C9C00
One tweaked header sample
Code:
000314BC 00000400 song001.msnd....................................
0002C1DC 00031A00 bgm_10.msnd.....................................
0002E974 0005DC00 song003.msnd............................t.......
00031C60 0008C600 song004.msnd............................`.......
0002EA10 000BE400 song005.msnd....................................
000128A8 000ED000 song006.msnd.............................(......
0002FFDC 000FFA00 song007.msnd....................................
000128A8 000ED000 song006.msnd.............................(......
00027864 0012FA00 songJingle.msnd.........................dx......
0003106C 00157400 song008.msnd............................l....t..
0002EAF4 00188600 songJingle2.msnd................................
000128A8 001B7200 song016.msnd.............................(...r..
0003106C 001C9C00 song018.msnd............................l.......
00000000 00000000 ................................................
00000000 00000000 ................................................
00000000 00000000 ................................................
00000000 00000000 ................................................
00000000 00000000 ................................................
00000000 00000000 ................................................
00000000 00000000 ................................................
00000000 00000000 ................................................
the "song" part may be a name of sorts- several references to Jingle2.msnd are seen in the file.
Pulling song001.msnd from the file and viewing that
Appears to be a header section
Code:
00000004 00000000 ....
00000008 00000000 ....
0000000C 00000000 ....
00000010 00000040 ...@
00000014 000060A0 ..`.
00000018 00006400 ..d.
0000001C 00000000 ....
00000020 00006048 ..`H
00000024 0000035C ...\
00000028 0002B0BC ....
0000002C 00054F60 ..O`
At 40 there is data but at 30 there is SSEQ
At 60A0 in the new file there is SNBK
At 6400 there is SWAR
(this seems to hold for other files)
These are the three files needed for complete SSEQ playback,
At 6078 the SSEQ file turns to 00 so that might be some padding/file length.
035c could well be the length of the SBNK (if a 0000 is used to end the file)
0002 B0BC could be the length of the SWAR as a 4 bytes later there comes the Jingle2.msnd "reference" and a bit more data before starting the next file.
00054F60 might be playback help stuff
More fiddling needed. A quick scan of BGM.dat looks like what is known so far is good.
Also voice.dat and se.dat (now having files with the extension .se and .swav with the .swav appearing to correspond to the .se files) hold up. To this end it looks like a rejigged SDAT format. .dat.tbl files appear to grow in size with the amount of files contained within the dat files.
Conventional Wave files.
Used by Electroplankton. Music making games often have odd formats at their heart and Electroplankton has plain wave files as you can generate even with loads of tools. Related to the below format.
BAR format (seemingly package files in this case for wave format)
Brothers in Arms. A very odd game for hackers and pretty much forgotten.
Everything is in "BAR" files with one named sounds.bar
Looking at the other files they start with what could be simple pointers/locations with nothing else
In the sounds.bar there are bunch of "RIFF" which is classic wave file behaviour- http://soundfile.sapp.org/doc/WaveFormat/
Would be pointers line up fairly well although they appear to be offset (not checked how/how much) and there are more amounts of RIFF than pointers.
Still straight extraction gives a apparently straight windows compatible wave file- some orchestral stuff for the tests at 32 bit float 22050Hz (22KHz- fairly standard low grade sampling rate) and mono.
PCM audio.
Used by N+
This is a raw PCM audio format, better audio editors feature raw import (audacity http://audacity.sourceforge.net/ has the ability) and raw export is too troubling either.
ADX/AHX-
An old format seen back on the dreamcast and systems since but appeared on the DS as well. Games have been seen to split the difference between this and SDAT (Ninja Gaiden being a good example).
Used by several games apparently http://www.cri-mw.com/product/adoption/platform/ds.html (note this can also include their video format and their file packing/handling stuff).
First spotted in a basketball game but came to the fore in The World ends with you often referred to as TWEWY. It is pretty much a wrapper format for some MPEG audio of various flavours and several tools are capable of handling conversion to and from not to mention file system hacks are viable.
adx2wav
adh2wav
wav2adx being the main tools here
They can be found with a simple search but some downloads might appear at some point.
http://www.geocities.co.jp/Playtown/2004/dcdev/dcdev.html
DSE audio format.
Home page in Japanese for the library http://www.procyon-studio.co.jp/dse/
Some reverse engineering for the pokemon stuff http://projectpokemon.org/wiki/Digital_Sound_Elements
GBAtemp thread http://gbatemp.net/threads/need-some-help-reversing-the-dse-audio-formats.405139/
Seen in various extensions like .pb and has magic stamps/section stamps like SED SWD and SMD
Seen in Inazuma 11
From the relocalisation project
Our guess as to what goes would be based on some of the magic stamps in the file and the history of DS audio it is likely some form of close to hardware decoding wave/PCM/IMA-ADPCM. If a straight undub did not work try making the file names the same and fiddling there.
It appears to be one of the simplest packing formats on the DS with several things like it
Code:
00000000 | 3244 5F30 3030 2E53 4544 0000 0000 0000 | 2D_000.SED......
00000010 | 0000 0000 0000 0000 0000 0000 BC08 0000 | ................
00000020 |3244 5F30 3030 2E53 5744 0000 0000 0000 | 2D_000.SWD......
00000030 | 0000 0000 0000 0000 BC08 0000 C0CA 0100 | ................
First line is file name
First 14 bytes appear to be size (although flipping them gets a bit odd for really big numbers)
In the second line BC08 flips to 08BC which is the start of a file (0000 in the first line indicates the file starts at the start of the file so that is not much use for reversing).
The next line is 7CD3, looking back for a second you have BC08 C0CA 0100 or more accurately 08BC and 0001 CAC0, adding them rather nicely produces 0001 D37C. This is quite nice in rom hacking*- you saw the rest of the rom where things had 16byte alignment.
*other roms/files like alignment so file start + length does not always equal next file start location.
0001 D37C is where the next file starts.
All names appeared to be filename.S?? so searching for .S yields 852 files. Add one as there is a file called Makefile which is detailed at 66C0 in the .ph file. Odd little files like this can make or break a rom hack so I looked at that.
E875 4D02
translates as
024D75E8
050B long
024D 7AF3 is the end which is rather nicely also the next file still (means things probably did not change as the file went on)
It appears to do as it says on the tin, perhaps not quite as nice as princess maker, zoids saga stuff for sound or some of the other interesting things that have been dug out of roms over the years.
Code:
#
#-------------------------------------------------------------------------------
# author : nozuru
# memo : データの追加・削除をした場合はcleanすること
#-------------------------------------------------------------------------------
NUL = /dev/null
TOOLPATH = ../../Tool/packer
PACKER = $(TOOLPATH)/packer
BINDIR = bin
INSTALLDIR = ../ ../ ../ina_main/data_iz/sound/ge
SRCS := $(wildcard *.SED *.SMD *.SWD)
vpath %.pb $(BINDIR)
#-------------------------------------------------------------------------------
#packerが第一引数からパック名・フォルダ名・ルートディレクトリ名を取り出すため
#カレントディレクトリ名が入るように相対パスを指定
#パス区切り文字として'\'しか受け付けないので注意
all: makedir ge.pb
ge.pb: $(SRCS)
@$(PACKER) ..\\ge
@mv ../ge.pb $(BINDIR)/sound.pb
@mv ../ge.ph $(BINDIR)/sound.ph
#-------------------------------------------------------------------------------
makedir:
@mkdir -p $(BINDIR)
#-------------------------------------------------------------------------------
install: all
@cp $(BINDIR)/sound.p* $(INSTALLDIR)
#-------------------------------------------------------------------------------
clean:
@-$(RM) -R $(BINDIR)
#-------------------------------------------------------------------------------
http://pastebin.com/uA6refYY
SAD audio format
Seen in Zombi Daisuki and possibly a few others. Usually sat alongside bin files with the magic stamp SIR0
Pending further research one file list with sizes. Do note the game is quite interesting from a hacker perspective.
Code:
1472 # sizedata.bin
96 # volumedata.bin
6048 # filelist.bin
16912 # se_zo_vo_zombie_m5.sad
13808 # se_zo_vo_zombie_m3.sad
16304 # se_zo_vo_zombie_m2.sad
22000 # se_zo_vo_zombie_m1.sad
9728 # se_zo_vo_zombie_f5.sad
4944 # se_zo_vo_zombie_f4.sad
23520 # se_zo_vo_zombie_f3.sad
16032 # se_zo_vo_zombie_f2.sad
1593216 # bgm_zo_ev_99_epilogue_l.sad
19744 # se_zo_vo_zombie_f1.sad
15504 # se_zo_vo_swat_6.sad
18048 # se_zo_vo_swat_5.sad
26016 # se_zo_vo_swat_3.sad
17776 # se_zo_vo_swat_2.sad
13904 # se_zo_vo_swat_1.sad
16032 # se_zo_vo_human_m7.sad
20464 # se_zo_vo_human_m6.sad
19200 # se_zo_vo_human_m5.sad
14352 # se_zo_vo_human_m4.sad
19888 # se_zo_vo_human_m3.sad
5232 # se_zo_vo_human_m2.sad
12880 # se_zo_vo_human_m1.sad
34960 # se_zo_vo_human_f7.sad
25216 # se_zo_vo_human_f6.sad
19936 # se_zo_vo_human_f5.sad
16864 # se_zo_vo_human_f4.sad
16960 # se_zo_vo_human_f3.sad
4976 # se_zo_vo_human_f2.sad
5216 # se_zo_vo_human_f1.sad
20464 # se_zo_vo_cameraman_6.sad
17856 # se_zo_vo_cameraman_3.sad
13728 # se_zo_vo_cameraman_2.sad
15440 # se_zo_vo_cameraman_1.sad
17296 # se_zo_vo_boss_9_7.sad
21360 # se_zo_vo_boss_9_6.sad
16080 # se_zo_vo_boss_9_5.sad
25840 # se_zo_vo_boss_9_4.sad
23440 # se_zo_vo_boss_9_3.sad
33728 # se_zo_vo_boss_9_2.sad
29280 # se_zo_vo_boss_9_1.sad
17712 # se_zo_vo_boss_7_6.sad
21360 # se_zo_vo_boss_7_5.sad
29872 # se_zo_vo_boss_7_3.sad
15680 # se_zo_vo_boss_7_2.sad
22976 # se_zo_vo_boss_7_1.sad
6768 # se_zo_vo_boss_6_6.sad
8784 # se_zo_vo_boss_6_5.sad
392624 # bgm_zo_title_l.sad
19648 # se_zo_vo_boss_6_3.sad
18976 # se_zo_vo_boss_6_2.sad
18272 # se_zo_vo_boss_6_1.sad
36608 # se_zo_vo_boss_5_6.sad
20576 # se_zo_vo_boss_5_5.sad
37504 # me_zo_gn_sortie.sad
67200 # se_zo_at_death_meteor.sad
15136 # se_zo_vo_boss_5_3.sad
12448 # se_zo_vo_boss_5_2.sad
10032 # se_zo_vo_boss_5_1.sad
17440 # se_zo_vo_boss_4_6.sad
20944 # se_zo_vo_boss_4_5.sad
16752 # se_zo_vo_boss_4_3.sad
15632 # se_zo_vo_boss_4_2.sad
15376 # se_zo_vo_boss_4_1.sad
14752 # se_zo_vo_boss_3_6.sad
18624 # se_zo_vo_boss_3_5.sad
29664 # se_zo_vo_boss_3_3.sad
17680 # se_zo_vo_boss_3_2.sad
8768 # se_zo_vo_boss_3_1.sad
6352 # se_zo_vo_boss_2_6.sad
7168 # se_zo_vo_boss_2_5.sad
34576 # se_zo_vo_boss_2_3.sad
28752 # se_zo_vo_boss_2_2.sad
22144 # se_zo_vo_boss_2_1.sad
15360 # se_zo_vo_boss_1_6.sad
19200 # se_zo_vo_boss_1_5.sad
31536 # se_zo_vo_boss_1_3.sad
10352 # se_zo_vo_boss_1_2.sad
6064 # se_zo_vo_boss_1_1.sad
14864 # se_zo_vo_boss_0_6.sad
18720 # se_zo_vo_boss_0_5.sad
12336 # se_zo_vo_boss_0_3.sad
15840 # se_zo_vo_boss_0_2.sad
11504 # se_zo_vo_boss_0_1.sad
7696 # se_zo_vo_zombie_m4.sad
57920 # se_zo_ev_env_sand_l.sd
56256 # se_zo_ev_eyes.sd
106304 # se_zo_ev_farm_l.sd
107008 # se_zo_ev_farm_sad_l.sd
5408 # se_zo_ev_finger.sd
15808 # se_zo_ev_fire_ignite.sd
38272 # se_zo_ev_fire_l.sd
8000 # se_zo_ev_fist.sd
23744 # se_zo_ev_footwork_l.sd
108416 # se_zo_ev_forest_l.sd
25184 # se_zo_ev_gas_l.sd
25888 # se_zo_ev_glass_01.sd
33760 # se_zo_ev_glass_02.sd
25792 # se_zo_ev_gun_01.sd
25024 # se_zo_ev_gun_02.sd
5152 # se_zo_ev_gun_set.sd
17312 # se_zo_ev_gus_bottle.sd
5280 # se_zo_ev_hammer.sd
19360 # se_zo_ev_helicopter_l.sd
7808 # se_zo_ev_homer.sd
8256 # se_zo_ev_hotdog.sd
31840 # se_zo_ev_howl.sd
47712 # se_zo_ev_jet_l.sd
11840 # se_zo_ev_ketchup.sd
61312 # se_zo_ev_kiss.sd
6944 # se_zo_ev_knock.sd
11872 # se_zo_ev_landing.sd
29120 # se_zo_ev_maj_eff.sd
18048 # se_zo_ev_news_01.sd
19552 # se_zo_ev_news_02.sd
17632 # se_zo_ev_news_03.sd
19392 # se_zo_ev_news_04.sd
12640 # se_zo_ev_news_05.sd
14912 # se_zo_ev_news_06.sd
11392 # se_zo_ev_news_noise.sd
9152 # se_zo_ev_paper.sd
11296 # se_zo_ev_phone_button.sd
25088 # se_zo_ev_phone_ringtone.sd
34304 # se_zo_ev_rain_l.sd
14944 # se_zo_ev_red_point.sd
53184 # se_zo_ev_rumble_l.sd
14272 # se_zo_ev_run.sd
95328 # bgm_zo_ev_00_prologue_a.sd
67168 # se_zo_ev_env_h_2_l.sd
5440 # se_zo_ev_siren_l.sd
21664 # se_zo_ev_sovetsky_laugh.sd
5344 # se_zo_ev_splash_01.sd
53472 # se_zo_ev_splash_02.sd
5984 # se_zo_ev_step.sd
12544 # se_zo_ev_step_back.sd
36896 # se_zo_ev_step_slow.sd
16128 # se_zo_ev_swat_call.sd
16864 # se_zo_ev_switch_open.sd
31232 # se_zo_ev_tank_l.sd
10592 # se_zo_ev_timer.sd
81344 # se_zo_ev_truck.sd
3904 # se_zo_ev_turn.sd
5920 # se_zo_ev_tv_noise.sd
41952 # se_zo_ev_tv_noise_l.sd
34688 # se_zo_ev_tv_noise_small.sd
8096 # se_zo_ev_tv_off.sd
53408 # se_zo_ev_tv_smile.sd
2976 # se_zo_ev_umbrella.sd
17824 # se_zo_ev_up_wipe.sd
16352 # se_zo_ev_walk_l.sd
50912 # se_zo_ev_wind_l.sd
15712 # se_zo_ev_wink.sd
9344 # se_zo_ev_zoom_01.sd
89152 # se_zo_ev_z_wakeup.sd
143104 # se_zo_farm_01.sd
29408 # se_zo_sine_ex.sd
9472 # se_zo_sine_exq.sd
84512 # se_zo_soccer_01.sd
94624 # se_zo_stage_01.sd
12640 # se_zo_stage_02.sd
13824 # se_zo_stage_11.sd
9216 # se_zo_stage_12.sd
13184 # se_zo_stage_13.sd
10944 # se_zo_stage_14.sd
13536 # se_zo_stage_15.sd
15360 # se_zo_stage_16.sd
15552 # se_zo_stage_21.sd
22112 # se_zo_stage_22.sd
15712 # se_zo_stage_24.sd
21152 # se_zo_stage_25.sd
18080 # se_zo_stage_26.sd
21440 # se_zo_stage_27.sd
10400 # se_zo_stage_28.sd
21568 # se_zo_stage_29.sd
28576 # se_zo_stage_30.sd
13536 # se_zo_stage_31.sd
12768 # se_zo_system_01.sd
104448 # se_zo_ev_env_h_1_l.sd
3872 # se_zo_ev_emergency_switch.sd
16384 # se_zo_ev_electric_02.sd
11264 # se_zo_ev_electric_01.sd
28384 # se_zo_ev_eff_2.sd
25824 # se_zo_ev_eff_1.sd
10208 # se_zo_ev_drum.sd
32736 # se_zo_ev_drip_l.sd
84544 # se_zo_ev_drip.sd
12576 # se_zo_ev_descent.sd
11328 # se_zo_ev_creak.sd
22240 # se_zo_ev_cow.sd
19552 # se_zo_ev_collapse.sd
9600 # se_zo_ev_clapper_02.sd
5280 # se_zo_ev_clapper_01.sd
89088 # se_zo_ev_cheer_l.sd
90208 # se_zo_ev_cheer_2_l.sd
24960 # se_zo_ev_cannon_set.sd
49888 # se_zo_ev_cannon.sd
12192 # se_zo_ev_break_02.sd
38880 # se_zo_ev_break_01.sd
43904 # se_zo_ev_bomber.sd
11104 # se_zo_ev_bom.sd
41728 # se_zo_ev_attack_shout_02.sd
16224 # se_zo_ev_attack_cage_2.sd
37024 # se_zo_ev_attack_cage.sd
49344 # se_zo_ev_alert.sd
17408 # se_zo_common_01.sd
4704 # me_zo_gn_skill_up.sd
3104 # me_zo_gn_gameover.sd
3392 # me_zo_gn_clear.sd
4320 # me_zo_ev_siren.sd
95168 # bgm_zo_ev_00_prologue_b.sd
11616 # bgm_zo_st_99_last_battle_l.sd
8352 # bgm_zo_st_20_space_l.sd
90784 # bgm_zo_st_18_garden_l.sd
26656 # bgm_zo_st_10_fy_l.sd
26656 # bgm_zo_st_10_fy2_l.sd
8640 # bgm_zo_st_09_mm_l.sd
8640 # bgm_zo_st_09_mm2_l.sd
23456 # bgm_zo_st_08_sp_l.sd
23488 # bgm_zo_st_08_sp2_l.sd
9600 # bgm_zo_st_07_pk_l.sd
10272 # bgm_zo_st_07_pk2_l.sd
6784 # bgm_zo_st_06_ls_l.sd
6784 # bgm_zo_st_06_ls2_l.sd
8160 # bgm_zo_st_05_gd_l.sd
8192 # bgm_zo_st_05_gd2_l.sd
8576 # bgm_zo_st_04_om_l.sd
8576 # bgm_zo_st_04_om2_l.sd
9504 # bgm_zo_st_03_ht_night_l.sd
9568 # bgm_zo_st_03_ht_night2_l.sd
11072 # bgm_zo_st_02_ht_day_l.sd
11072 # bgm_zo_st_02_ht_day2_l.sd
13472 # bgm_zo_st_01_gw_l.sd
13472 # bgm_zo_st_01_gw2_l.sd
20128 # bgm_zo_st_00_home_l.sd
3776 # bgm_zo_gn_swat_go_l.sd
4736 # bgm_zo_gn_swat_arrival_l.sd
2080 # bgm_zo_gn_swat_arrival_2.sd
4000 # bgm_zo_gn_result_l.sd
4000 # bgm_zo_gn_result_2_l.sd
4320 # bgm_zo_gn_briefing_l.sd
13760 # bgm_zo_gn_boss2_l.sd
5728 # bgm_zo_gn_boss1_l.sd
13248 # bgm_zo_gn_boss1_g_l.sd
4320 # bgm_zo_ev_siren_l.sd
67584 # bgm_zo_ev_news_l.sd
77184 # bgm_zo_ev_farm_sad_l.sd
76640 # bgm_zo_ev_co_chara_se_l.sd
76448 # bgm_zo_ev_co_chara_l.sd
25376 # bgm_zo_ev_30_rehome_l.sd
95552 # bgm_zo_ev_29_missile_l.sd
59488 # bgm_zo_ev_28_zreport_l.sd
91232 # bgm_zo_ev_27_president_l.sd
97056 # bgm_zo_ev_22_poison_l.sd
97216 # bgm_zo_ev_18_military_l.sd
82432 # bgm_zo_ev_15_ballad_l.sd
48064 # se_zo_ev_shoot.sd
84288 # bgm_zo_ev_01_start.sd
31328 # se_zo_ev_shining.sd
260 Files # 8659648 bytes
BDX
Seen in Daigasso Band brothers (and sequel)
Another music game with a custom format, reverse engineered and tools made to support it
http://www.auby.no/wiki/index.php?title=Band_Brothers_DX#Song_format
http://dshack.wikia.com/wiki/Daigasso!_Band_Bros._series
deufeufeu also did a fair bit of work but it seems a lot of it was lost.
DSB format
Seen in Taiko no Tatsujin at least. One of the few games to combine SDAT and custom stuff.
various magic stamps in the file
DSSB8- 64 bytes followed by 00 0000 hex leading to an ASCII name same as the file name up to 18 hex (00 padded if too short) 0100 0000 next for all files. A file length on occasion but often falls short. 40 and then padded with 00 until the next section for all files.
DSST8- 64 bytes followed by 00 0000 hex leading to an ASCII name same as the file name up to 58 hex (00 padded if too short) alternated between ???? FFFF and 0000 0000 for the 0100 0000 section. ???? was usually quite large F6FF and such with many values repeating. Another length value (slightly smaller than the main one above) and all sort of fairly random stuff to make up the rest.
BNSF (shortly after this it has sdat), perhaps not as long as the ones before it.
Three entries regardless of size- someone mentioned easy and hard modes which could well be it.
Between BNSF and S14 there appear to be 4 bytes given over to a size of some form.
After BNSF there was usually SDAT but some had loop and then SDAT a line (16 bytes) later (many files with jingle in the name although several jingle files without it).
After that came the data but nothing jumped out at me. It was densely packed and did not compress well which is classic digitised wave behaviour although with files ranging from under 10 kilobytes to just shy of 800 kilobytes it could mean several things.
SDFDAT
Seen in Super princess peach so far (another TOSE game causing fun).
http://gbatemp.net/threads/vgmtrans-wont-work-with-super-princess-peach.357428/#post-4824844
An actual custom midi style and wave sporting format. More on the thread linked, fairly basic archive format breaking down into what looks to be self contained song/audio packages.
That over onto the thread. Feel free to add things if you want or point us at other interesting sound related formats or troublesome games.
OGG/OGM
A common, patent free and open source, media format. Seen very often in PC games but no stranger to consoles either, handhelds are less common but an example for the DS can be seen in " WWE SmackDown vs Raw 2010 featuring ECW".
http://gbatemp.net/threads/the-various-audio-formats-of-the-ds.305167/page-2#post-4250023 has more.
MIDI
A common, but so well liked among audio fans, sequenced format. Found in a few games but they might equally be developer leftovers.
Custom XM
Seen in a DSiware game. At present it was mainly reconstructed from running data rather than standalone decode.
https://gbatemp.net/threads/dsiware-problem.559964/