Jump to content

Senran Kagura New Link / Dolphin Wave ".spd" audio archive file


PlsSendHelp
Go to solution Solved by DKDave,

Recommended Posts

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 by PlsSendHelp
Link to comment
Share on other sites

  • Solution

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 by DKDave
Added QuickBMS script
  • Thanks 1
Link to comment
Share on other sites

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

}

 

  • Thanks 1
Link to comment
Share on other sites

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.

 

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...