X68000版悪魔城ドラキュラの解析

解析というほど大げさなものではありませんが……

まず、ゲームをインストールした先に、これだけのファイルがあります。

ファイルリスト
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
なんとなく内容が分かっているファイルのおおまかな説明
実行ファイル 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で分割用のスクリプトを書きました。

dra_adpcm.py
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'])))
>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 バイト

このように分割したADPCMファイルができあがります。
Audacityの「Rawデータの取り込み」→「エンコーディング:VOX ADPCM」などにして読み込むことができます。
サンプリング周波数は大体15.6kか7.8kです。ファイルの中に周波数の情報も書かれているのかもしれませんが、ADPCMのフォーマットをよく理解できていないため、そこは不明です。

とりあえずこんなところ。

コメントを残す