PlsSendHelp Posted December 27, 2023 Share Posted December 27, 2023 (edited) Hello, i'm here to ask if anyone can help me solve this .spd audio archive format? It's a format used by Honey ∞ Parade Games in games such as Senran Kagura: New Link and Dolphin Wave to store audio files (in the case of DW, it stores a bunch of .ogg files from what i have seen so far from digging the PC version's files). At first i check if my foobar2000 with the vgmstream component can extract the content but failed. I then tried to see if this format have been solved before but all i could find was another format with similar name for some GameCube games. Since i'm a complete noob at reverse engineering, i can only explain things in the header section: From what i have seen so far, every files starts with a bunch of headers like "HEAD", "SNHD", "SNIF" and "SNDT" with some bytes between each header. The amount of "SNHD" is different in each file, which led me to believe that the amount of "SNHD" headers is the amount of files contain inside the archive, and the bytes after each "SNHD" header is some soft of id labelling. If anyone can furthering research this format and share it here, thank you so much for that in advance. The sample included here is from Dolphin Wave (the PC version if anyone's asking) and stores a bunch of sound effects used in the game. Thank you so much in advance. samples.zip Edited December 27, 2023 by PlsSendHelp Link to comment Share on other sites More sharing options...
Solution DKDave Posted December 27, 2023 Solution Share Posted December 27, 2023 (edited) From a quick look at the file: The "HEAD" section contains the number of files (8) Each "SNHD" section contains the offset to each file - first one is 0x90, then 0x20590, etc. Each file begins with a "SNIF" header, which contains channels and sample rate info, and then the "SNDT" section is the audio data. The audio here is 16-bit PCM Attached is a QuickBMS script to extract them as playable .wav files - I've made some assumptions about the format so I'm not sure if it's 100% correct, but give it a try and see if it sounds correct. spd.zip Edited December 27, 2023 by DKDave Added QuickBMS script 1 Link to comment Share on other sites More sharing options...
ikskoks Posted December 27, 2023 Share Posted December 27, 2023 File format: // Dolphin Wave (PC) // SPD file format // header 4 bytes (char) - signature // "HEAD" 4 bytes (uint32) - chunk header size // 8 4 bytes (uint32) - unknown // 1 4 bytes (uint32) - number of files // index number_of_files * { 4 bytes (char) - chunk signature // "SNHD" 4 bytes (uint32) - chunk header size // 8 8 bytes (uint64) - SNIF chunk offset } // data number_of_files * { 4 bytes (char) - chunk signature // "SNIF" 4 bytes (uint32) - chunk header size // 16 2 bytes (uint16) - number of channels // e.g. 2 2 bytes (uint16) - bits? // e.g. 16 4 bytes (uint32) - rate // e.g. 22050 8 bytes (uint64) - unknown 4 bytes (char) - chunk signature // "SNDT" 4 bytes (uint32) - chunk size x bytes - audio data } 1 Link to comment Share on other sites More sharing options...
DKDave Posted December 27, 2023 Share Posted December 27, 2023 10 minutes ago, ikskoks said: File format: // Dolphin Wave (PC) // SPD file format // header 4 bytes (char) - signature // "HEAD" 4 bytes (uint32) - chunk header size // 8 4 bytes (uint32) - unknown // 1 4 bytes (uint32) - number of files // index number_of_files * { 4 bytes (char) - chunk signature // "SNHD" 4 bytes (uint32) - chunk header size // 8 8 bytes (uint64) - SNIF chunk offset } // data number_of_files * { 4 bytes (char) - chunk signature // "SNIF" 4 bytes (uint32) - chunk header size // 16 2 bytes (uint16) - number of channels // e.g. 2 2 bytes (uint16) - bits? // e.g. 16 4 bytes (uint32) - rate // e.g. 22050 8 bytes (uint64) - unknown 4 bytes (char) - chunk signature // "SNDT" 4 bytes (uint32) - chunk size x bytes - audio data } For the unknown 1 value in the HEAD chunk, I could refer to the audio codec being PCM16, but would need files with different audio codecs to compare - the android version of "se_sys" is identical to the PC sample posted here. The unknown in the SNIF chunk is the data size, although it's sometimes just slightly different to the actual data size in the SNDT chunk. 1 1 Link to comment Share on other sites More sharing options...
YYHYN Posted October 16 Share Posted October 16 Hello, do you know how to decrypt the asset files of Dolphin Wave, they end with .lza and are encrypted, here are some sample files, thank you very much.assets.zip Link to comment Share on other sites More sharing options...
GDL Posted October 27 Share Posted October 27 (edited) the asset folder has some duplicates, one lza file and one lzs file for the same asset in some cases it seems, I wonder if it can be used to figure out the encryption as not all the files are available in lzs format which can be extracted with the lzss0 script from chrrox, here are some samples if anyone wants to take a look at the model and texture files: un01002_under.7z Edited October 27 by GDL Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now