樱花大战资源分析之一 背景音乐提取

樱花大战资源分析之一 背景音乐提取

 

作者:leexuany(小宝)

 

资源分析的第一步就是,先把背景音乐提取出来,有音乐听,干起活来才不枯燥嘛。
这是我分析游戏资源的一般过程,但是在樱花大战2这里,小宝却碰到了一点小麻烦。为了避免后来的朋友再在这里浪费时间,特将一周的笔记共享出来。(http://blog.csdn.net/leexuany)

 

樱花大战

  文件中 播放时
编码 ADPCM PCM
声道 立体声 立体声
频率 22050Hz 22050Hz
比特 4 Bits 16 Bits

 

《樱花大战》使用的BGM基本属于标准的ADPCM,只是在data chunk与实际数据之间加入了loop信息。包括4字节loop标志和4字节LoopBegin(当一个采样点占16Bits时,LoopBegin*声道数就是循环开始的偏移量)

 

樱花大战2

  文件中 播放时
编码 PCM PCM
声道 立体声 立体声
频率 22050Hz 22050Hz
比特 8 Bits 8 Bits

 

《樱花大战2》背景音乐存放在游戏盘上,后缀名为S2S。与标准的WAV格式有些许不同,但也并非网上几篇文章说的那样是CRI公司的ADX格式。小宝推测这也许是OVERWORKS重制游戏时在WAV的基础上修改的。
其中"SK2S"对应"WAVE","sfmt"对应"fmt ","sdat"对应"data"。
文件末尾处还有一个"smpl"chunk,这个chunk可以在MSDN中查到,但是只有寥寥几个字,说它是与ADPCM相关的一个chunk。

还好在其他网络上找到了一份代码,里面有这样的定义:

// 这种语言我没见过,.bt后缀,语法又很像C++ // Chunk SMPL typedef struct { ID chunkID; long chunkSize; SMPL_Manufacturer Manufacturer; SMPL_Product Product; // Product code (Manufacture) SMPL_Sample_Period Sample_Period; SMPL_MIDI_Unity_Note MIDI_Unity_Note; SMPL_MIDI_Pitch_Fraction MIDI_Pitch_Fraction; SMPL_SMPTE SMPTE; SMPL_SMPTE_Offset SMPTE_Offset; SMPL_SL Num_Sample_Loops; SMPL_SD Sampler_Data; SMPLLOOPS loops[Num_Sample_Loops]; //Padding so the next chunk starts on an even byte if( (chunkSize & 1) && (FTell() < FileSize()) ) uchar padding; } SMPLCHUNK; // SMPL Loop typedef struct { SMPLLOOPS_Cue_ID Cue_Point; SMPLLOOPS_Type Type; SMPLLOOPS_Start Start; SMPLLOOPS_End End; SMPLLOOPS_Fraction Fraction; SMPLLOOPS_Play_Count Play_Count; } SMPLLOOPS;

 

注:Start和End都是以采样帧为单位的,也就是说Start*nBlockAlign就是循环开始的偏移量,End*nBlockAlign就是循环结束的偏移量。(nBlockAlign参考WAVEFORMATEX结构)


虽然找到了smpl的结构,但是还有一点,S2S中的loop信息都是错误的,真正的循环信息被硬编码到了游戏的程序代码里面了。如果实在需要的话,就只能去调试游戏了,但是很分散不易找全,小宝这里提供一份目前找到的,见附录。

 

后记

 

音频格式和循环信息都找到之后就可以写代码提取音乐了,但是当我仔细地试听之后,却发现一部分音乐在循环的时候会出现轻微短暂的不连贯,而在游戏中的时候一般不会注意到,也许那时我把更多的精力放在游戏的情节上了吧。

 

附录

Name LoopBegin|LoopEnd SM01 00000000|002E4423 SM02 0004641F|0026B882 SM03 0001A121|0029BEA5 SM04 00000000|00229DC7 SM05 00011F7B|00250247 SM06 00034CDF|001B2C84 SM07 00000000|00229982 SM08 0000A43A|00116D2B SM09 00037CC5|0020FC09 SM10 000331E5|001FF151 SM11 0003F918|002EED7E SM12B 0001AE82|001E7242 SM13 00000000|0014E750 SM14 0004B908|0025854F SM15 00004B78|001767AA SM16 00088A4A|0022B923 SM17 00034A48|002B5E52 SM18 00020B7F|003899AF SM19 00000000|001E7B55 SM20 0006A58A|00302C6B SM21 00027C47|00285E9C SM22 0001A561|00296B30 SM23 00009765|0023CC10 SM24 00007288|0025ECA2 SM25 0000D0DA|001EC0A2 SM26 000409CA|002C08E0 SM27 00019549|0056371B SM28 00035E48|00166D6B SM29 000207A0|001B74BA SM31 00023D09|0016FC5D SM32 00013CAF|001EC488 SM33 0002C08E|0016F05F SM34 00052E65|00239726 SM35 00005375|001652A5 SM36 0006DB63|00186036 SM37 0000A99F|001A513F SM38 0001ECAA|001E8C64 SM39 00019E1D|001F7D86 SM40 0000F990|000FD89B SM41 00005C96|0018E5B3 SM42 00014385|001F898A SM43 00053BA8|00279EB2 SM44 00021A1D|0010906D SM45 000123C2|0012BE18 SM46 00000000|00000000 SM47 00016763|00124126 SM48 00013321|001868EE SM49 000158C2|00142F77 SM50 00007281|0011D18A SM51 00000000|0015311A SM52 0000AADD|001D1E85 SM54 000157C6|0022C61C SM55 000098D0|001D9185 SM56 00014FC2|000DADD9 SM57 000743A0|0021C49E SM58 00009473|0016EFAF

 

你可能感兴趣的:(游戏,c,struct,音乐,byte,loops)