解析というほど大げさなものではありませんが……
まず、ゲームをインストールした先に、これだけのファイルがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 1993/01/01 00:00 15,368 ADPCM_01.DAT 1993/01/01 00:00 18,516 ADPCM_04.DAT 1993/01/01 00:00 24,584 ADPCM_05.DAT 1993/01/01 00:00 31,998 ADPCM_06.DAT 1993/01/01 00:00 29,504 ADPCM_08.DAT 1993/01/01 00:00 78,426 ADPCM_BG.DAT 1993/01/01 00:00 24,364 ADPCM_SE.DAT 1993/01/01 00:00 60,122 BLK0_S.DAT 1993/01/01 00:00 24,282 BLK0_V.DAT 1993/01/01 00:00 61,910 BLK1_S.DAT 1993/01/01 00:00 35,834 BLK1_V.DAT 1993/01/01 00:00 52,558 BLK2_S.DAT 1993/01/01 00:00 75,858 BLK2_V.DAT 1993/01/01 00:00 46,108 BLK3_S.DAT 1993/01/01 00:00 64,236 BLK3_V.DAT 1993/01/01 00:00 38,614 BLK4_S.DAT 1993/01/01 00:00 44,652 BLK4_V.DAT 1993/01/01 00:00 63,982 BLK5_S.DAT 1993/01/01 00:00 36,550 BLK5_V.DAT 1993/01/01 00:00 56,004 BLK6_S.DAT 1993/01/01 00:00 36,840 BLK6_V.DAT 1993/01/01 00:00 67,758 BLK7_S.DAT 1993/01/01 00:00 60,726 BLK7_V.DAT 1993/01/01 00:00 73,240 BLK8_S.DAT 1993/01/01 00:00 83,878 BLK8_V.DAT 1993/01/01 00:00 2,803 CI_0.FON 1993/01/01 00:00 313,218 DRA.X 1993/01/01 00:00 45,648 ENDING.DAT 1993/01/01 00:00 41,824 KMDRV.X 1993/01/01 00:00 18,478 MAP.DAT 1993/01/01 00:00 28,262 PATCH_MT.DAT 1993/01/01 00:00 45,354 SOUND_BG.DAT 1993/01/01 00:00 43,258 SOUND_MT.DAT 1993/01/01 00:00 55,744 SOUND_SC.DAT 1993/01/01 00:00 4,842 SOUND_SE.DAT 1993/01/01 00:00 2,334 TABLE_BG.DAT 1993/01/01 00:00 2,378 TABLE_MT.DAT 1993/01/01 00:00 2,562 TABLE_SC.DAT 1993/01/01 00:00 50,014 TITLE_S.DAT 1993/01/01 00:00 43,320 TITLE_V.DAT 1993/01/01 00:00 6,000 VOICE_BG.DAT 1993/01/01 00:00 17,043 VOICE_MT.DAT 1993/01/01 00:00 6,000 VOICE_SE.DAT 1993/01/01 00:00 496 YUSEN_TB.DAT |
1993/01/01 00:00 15,368 ADPCM_01.DAT 1993/01/01 00:00 18,516 ADPCM_04.DAT 1993/01/01 00:00 24,584 ADPCM_05.DAT 1993/01/01 00:00 31,998 ADPCM_06.DAT 1993/01/01 00:00 29,504 ADPCM_08.DAT 1993/01/01 00:00 78,426 ADPCM_BG.DAT 1993/01/01 00:00 24,364 ADPCM_SE.DAT 1993/01/01 00:00 60,122 BLK0_S.DAT 1993/01/01 00:00 24,282 BLK0_V.DAT 1993/01/01 00:00 61,910 BLK1_S.DAT 1993/01/01 00:00 35,834 BLK1_V.DAT 1993/01/01 00:00 52,558 BLK2_S.DAT 1993/01/01 00:00 75,858 BLK2_V.DAT 1993/01/01 00:00 46,108 BLK3_S.DAT 1993/01/01 00:00 64,236 BLK3_V.DAT 1993/01/01 00:00 38,614 BLK4_S.DAT 1993/01/01 00:00 44,652 BLK4_V.DAT 1993/01/01 00:00 63,982 BLK5_S.DAT 1993/01/01 00:00 36,550 BLK5_V.DAT 1993/01/01 00:00 56,004 BLK6_S.DAT 1993/01/01 00:00 36,840 BLK6_V.DAT 1993/01/01 00:00 67,758 BLK7_S.DAT 1993/01/01 00:00 60,726 BLK7_V.DAT 1993/01/01 00:00 73,240 BLK8_S.DAT 1993/01/01 00:00 83,878 BLK8_V.DAT 1993/01/01 00:00 2,803 CI_0.FON 1993/01/01 00:00 313,218 DRA.X 1993/01/01 00:00 45,648 ENDING.DAT 1993/01/01 00:00 41,824 KMDRV.X 1993/01/01 00:00 18,478 MAP.DAT 1993/01/01 00:00 28,262 PATCH_MT.DAT 1993/01/01 00:00 45,354 SOUND_BG.DAT 1993/01/01 00:00 43,258 SOUND_MT.DAT 1993/01/01 00:00 55,744 SOUND_SC.DAT 1993/01/01 00:00 4,842 SOUND_SE.DAT 1993/01/01 00:00 2,334 TABLE_BG.DAT 1993/01/01 00:00 2,378 TABLE_MT.DAT 1993/01/01 00:00 2,562 TABLE_SC.DAT 1993/01/01 00:00 50,014 TITLE_S.DAT 1993/01/01 00:00 43,320 TITLE_V.DAT 1993/01/01 00:00 6,000 VOICE_BG.DAT 1993/01/01 00:00 17,043 VOICE_MT.DAT 1993/01/01 00:00 6,000 VOICE_SE.DAT 1993/01/01 00:00 496 YUSEN_TB.DAT
実行ファイル | DRA.X | ゲーム本体の実行ファイル。 |
---|---|---|
KMDRV.X | 音楽再生用のデバイスドライバ。Konami Music DRiVerの略。 | |
画像 | BLK0~8_S.DAT BLK0~8_V.DAT |
それぞれのステージのマップデータや、BG用のグラフィックデータ。 敵キャラのデータもここに入ってるかどうかは不明。 |
TITLE_S.DAT TITLE_V.DAT |
同じように、タイトル画面/タイトルデモ用のグラフィックデータ。 | |
MAP.DAT | ステージクリア時に表示される、悪魔城全体図用のデータです(多分) | |
音 | SOUND_BG.DAT TABLE_BG.DAT |
内蔵音源(FM音源/ADPCM)用の音楽データ。TABLEが音色の設定など、SOUNDが楽譜データ(多分)。 この中身が解析できれば、MMLとかMIDIデータが作れる。 |
SOUND_MT.DAT TABLE_MT.DAT SOUND_SC.DAT TABLE_SC.DAT |
外部MIDI音源用の音楽データ。MTがMT-32などのLA音源用、SCがSC-55などのGS音源用。 あとは上記の内蔵音源用と同じだと思われるが、処理の仕方は違うだろう(内蔵音源用とMIDI信号用でコードが同じということは無いだろう) |
|
SOUND_SE.DAT | FM音源で再生する効果音データ。武器使用、アイテム取得、ドア開けた時などの音。 | |
ADPCM_01~08.DAT | それぞれのステージでしか使用しない効果音や声など。 例えばADPCM_06.DATは人形の声。 |
|
ADPCM_BG.DAT | 内蔵音源で用いられる音楽用効果音(ADPCM)……ぶっちゃけほぼドラムの音。 | |
ADPCM_SE.DAT | 効果音(ADPCM)、聴いた感じ、ドッペルゲンガーのステージ(Block7)の鏡やシャンデリアの破壊音。多分。 | |
VOICE_BG.DAT VOICE_MT.DAT VOICE_SE.DAT |
不明。ファイルの分かれ方からして、音楽演奏用、MT-32用、効果音用、ということくらいしか分からない。 |
で、この内ADPCM~はファイルフォーマットがなんとなく分かってきました。
下記はADPCM_06.DATの最初のところ
00000010 00002624 0000483A 00006568 00002610 90BA9141 0503BDCB 0B305411 10988D99 380302CA A9FE3269 0618CA8C AA313342 B809AC05 29A589F8 09004389 031D9539 D999B910 20440132 BDB31CA2 (以下延々と)
先頭から4つのアドレス(0x0010, 0x2624, 0x483A, 0x6568)が、それぞれの音声データの先頭アドレスです。
1つ目のアドレスは0x0010なので、次の行の00002610が最初のデータの先頭になります。
で、この0x2610は、この音声データのデータ長です。この次の90BA9141から0x2610(=9744)バイトが実データです。
……という処理を全部人力でやると死ぬので、Pythonで分割用のスクリプトを書きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import sys def read_long(data, addr): ret = 0 ret += (data[addr+0] * 0x100 * 0x100 * 0x100) ret += (data[addr+1] * 0x100 * 0x100) ret += (data[addr+2] * 0x100) ret += (data[addr+3]) return ret def read_bytes(data, begen_addr, length): ret = bytearray() for c in data[begen_addr:begen_addr+length]: ret.append(c) return ret argvs = sys.argv argc = len(argvs) for i, s in enumerate(argvs): print('%d:%s' % (i, s)) if (argc < 2): print('Usage:>python %s [binfile]' % argvs[0]) quit() with open(argvs[1], mode='rb') as f: read_data = f.read() idx = 0 datas = [] while True: begin_addr = read_long(read_data, idx) if (begin_addr > len(read_data)): break data_length = read_long(read_data, begin_addr) dat = {} dat['begin'] = begin_addr dat['length'] = data_length dat['value'] = read_bytes(read_data, dat['begin'] + 4, dat['length']) datas.append(dat) idx += 4 if idx >= datas[0]['begin']: break for i, d in enumerate(datas): filename = ("%s_%08X.adpcm" % (argvs[1], d['begin'])) with open(filename, mode='wb') as f: f.write(d['value']) s = '' for i in d['value'][0:0x0f]: s += ("%02x" % i) print("%08X: %08X: %s (%08x)" % (d['begin'], d['length'], s, len(d['value']))) |
import sys def read_long(data, addr): ret = 0 ret += (data[addr+0] * 0x100 * 0x100 * 0x100) ret += (data[addr+1] * 0x100 * 0x100) ret += (data[addr+2] * 0x100) ret += (data[addr+3]) return ret def read_bytes(data, begen_addr, length): ret = bytearray() for c in data[begen_addr:begen_addr+length]: ret.append(c) return ret argvs = sys.argv argc = len(argvs) for i, s in enumerate(argvs): print('%d:%s' % (i, s)) if (argc < 2): print('Usage:>python %s [binfile]' % argvs[0]) quit() with open(argvs[1], mode='rb') as f: read_data = f.read() idx = 0 datas = [] while True: begin_addr = read_long(read_data, idx) if (begin_addr > len(read_data)): break data_length = read_long(read_data, begin_addr) dat = {} dat['begin'] = begin_addr dat['length'] = data_length dat['value'] = read_bytes(read_data, dat['begin'] + 4, dat['length']) datas.append(dat) idx += 4 if idx >= datas[0]['begin']: break for i, d in enumerate(datas): filename = ("%s_%08X.adpcm" % (argvs[1], d['begin'])) with open(filename, mode='wb') as f: f.write(d['value']) s = '' for i in d['value'][0:0x0f]: s += ("%02x" % i) print("%08X: %08X: %s (%08x)" % (d['begin'], d['length'], s, len(d['value'])))
>python dra_adpcm.py ADPCM_06.DAT |
>python dra_adpcm.py ADPCM_06.DAT
という風に実行すると、
2020/04/16 14:00 9,744 ADPCM_06.DAT_00000010.adpcm 2020/04/16 14:00 8,722 ADPCM_06.DAT_00002624.adpcm 2020/04/16 14:00 7,466 ADPCM_06.DAT_0000483A.adpcm 2020/04/16 14:00 6,033 ADPCM_06.DAT_00006568.adpcm 4 個のファイル 31,965 バイト |
2020/04/16 14:00 9,744 ADPCM_06.DAT_00000010.adpcm 2020/04/16 14:00 8,722 ADPCM_06.DAT_00002624.adpcm 2020/04/16 14:00 7,466 ADPCM_06.DAT_0000483A.adpcm 2020/04/16 14:00 6,033 ADPCM_06.DAT_00006568.adpcm 4 個のファイル 31,965 バイト
このように分割したADPCMファイルができあがります。
Audacityの「Rawデータの取り込み」→「エンコーディング:VOX ADPCM」などにして読み込むことができます。
サンプリング周波数は大体15.6kか7.8kです。ファイルの中に周波数の情報も書かれているのかもしれませんが、ADPCMのフォーマットをよく理解できていないため、そこは不明です。
とりあえずこんなところ。