Seraphic Root BBS より



[1249] Matrimeleeの音欠けと対策 投稿者:NXV

<はじめに>

音が欠ける問題の切り分け

▼ケース1:P1の不正
 P1の中に、M1へ指示するためのデータがない(サウンドコードのテーブルに抜けがある)。
 例:KOF99のプロトタイプ


▼ケース2:M1の不正
 M1の中に、Vロムからサンプリングを読み出すためのアドレステーブルが欠落している。
 例:KOF2001


▼ケース3:Vロムの不正
 Vロムの中に音がない。
 例:ダンプ失敗、フェイク品など


▼ケース4:もともと存在しない
 シリーズものなどで、前作でその音があったとしても、次の作品で同じ音が使われるとは限らない。
 例:KOF2001、2002


<Matrimeleeの音欠け>

理由:このゲームは、ケース2 M1の不正です。

対策:M1のリダンプ、手作業によるM1の修復

<Matrimelee M1修復の実際>

対象がM1なので、やることはKOF2001の修復と同じです。
ただし、サウンドコードを表示する方法がわからなかったので、実際の手順は異なります。
ものごとを考えるときに、始まりから結末に向かって考えることを「演繹法」といい、結末から始まりに向かって考えるのを「帰納法」といいます。
KOF2001の時の手順が前者だとすれば、今回わたしがやってみたのは後者のようなものです。


 クララ復元
 M1ロム
 00004BFB: 20 63 0E 70 0E DC「キャーッ」
 00004C01: 20 71 0E 8C 0E DC「勝ったにょ」


この復元データを出した時の手順を説明します。他のキャラクターにも応用できるでしょう。

<1>
ちゃんと出ている音について調べる。
クララの2度目の勝ち台詞「お金持ちお金持ち」はちゃんと発音されるので、まずこの音について調べます。


<2>
JukeBoxやNeoJuke(こちらを薦めます)を使って、「お金持ちお金持ち」を探し、サウンドコードを特定します。結果、1A98ということが判明しました。さらに、その前の1A97、1A96が無音、1A95に同じキャラクターの台詞があることを確認します。


<3>
P1ロムをバイナリエディタで開き、サウンドコード1A98を探します。
実際には数値が逆転しているので 98 1A でサーチします。2個所見つかりますが00020492の方でしょう。
この前後の部分が、クララのためのサウンドコードということになります。
95 1A(=1A95)があるのでまず間違いありません。97 1A や 96 1A もあるので、音がなかった1A97、1A96にも本来はサウンドが振り分けられている可能性があります。このとき、この付近のサウンドコードで、サウンドが出るコードと出ないコードを書き留めておくといいでしょう。


<4>
VロムをVx2Wav.exeでWAVに変換して聞きます。
「お金持ちお金持ち」はV1ロムの103.2秒付近で聞こえました。
KOF2001の時と同じように、


 103.2×9.04×1024=955318

Windows電卓を16進に切り替えて

 955318=E93B6

なので、V1ロム(変換前)をバイナリエディタで開いて、000E9000あたりをみて音の切れ目、無音部分を探します。
08や80が並んでいるので視覚的に理解できます。
000E8D00が切れ目です。ここから次の切れ目までを抜き出して、Wx2Wavで変換してみると、「お金持ちお金持ち」でした。確定です。V1ロムの000E8D00からがこの声です。


<5>
ところで、KOF2001の時と同様、M1の音声テーブルは、6バイトで


 ??.xx.XX.yy.YY.??

という形になっています。たとえば、V1ロムのアドレス00012300〜00145600の音(こんなに大きなボイスは本当はありません)を呼び出すテーブルは、??.23.01.56.14.??となります。
つまり、上下2桁を除いたアドレスが、前後入れ替えて置かれています。ただし、V2〜V4は次のアドレスを上乗せします。


 V1ロムの音声:そのまま
 V2ロムの音声:Vロム内のアドレスに400000hを追加
 V3ロムの音声:Vロム内のアドレスに800000hを追加
 V4ロムの音声:Vロム内のアドレスにC00000hを追加


V4ロムのアドレス00012300〜00145600の音を呼び出すテーブルは、??.23.C1.56.D4.??となります。
話を戻します。
それならば、V1の000E8D00〜の音を呼び出すテーブルは、??.8D.0E.??.??.??となるはずです。
バイナリエディタでM1を開き、8D 0Eをサーチします。
M1の00004C08で発見。ここが1つのテーブルの2バイト目ですから、1バイト戻ったところから6バイト00004C07〜00004C0Cが、「お金持ちお金持ち」を呼び出すテーブルです。どうやらこのあたりにクララのための音声テーブルが集まっているようです。


<6>
さて、いよいよ復元です。
Wavに変換したVロムを聞いて「キャーッ」「勝ったにょ」を探します。<4>と同様の手順で、Vロムのアドレスを特定し、<5>を参考にして、テーブルに書き込まれるべきデータを決めます。
今回ラッキーなことに、「お金持ちお金持ち」の手前ですでに見つかりましたからいちいち計算する手間が省けました(いつもこううまくいくとは限りませんが)。
「キャーッ」はV1の000E6300〜000E7000、「勝ったにょ」は000E7100〜000E8C00なので、それぞれ、


 ??.63.0E.70.0E.??
 ??.71.0E.8C.0E.??


になります。

<7>
「お金持ちお金持ち」を呼び出すテーブル、M1の00004C07の前後に、空白(00が続いている部分)が見つからないでしょうか? ありました。すぐ手前の12バイトの空白が怪しいと思います。
なぜ怪しいかというと、サウンドコード1A98の手前1A97、1A96の2個が現状は無音で、12バイトとはサウンド2個分のテーブルだからです。
加えて言えばVロム上のサウンドも続けて収録されていて、Matrimeleeは何度も作り直されているKOFシリーズとは違って、ネオジオ初登場なので、データが「きれいに並んでいる」という期待が持てるからです(必ずしもそうとは限りませんが)。
したがって、ここに、


 20.63.0E.70.0E.DC
 20.71.0E.8C.0E.DC


を、仮に書き込みます。??だったところを、前後のにあるテーブルを真似て20とDCにしています。
そして、実際にゲームをやってみると…。どうやらあっているようです。
あっていなければ、<2>と<3>で調べたサウンドコードの状態と、M1のテーブルの「空き具合」を見ながら、他の部分に書き込んでみて、当たりを見つけます。わざわざ<2><3>の手順を踏んだのはそのためです。




投稿者:NXV >

長文を書いたので、フォローのために今夜まで出没することにします(節操がなくてすいません)。
サウンドコードの件、情報ありがとうございました。なるほど、Nebulaのオプションには、DIPに関係なくサウンドコードを表示させるオプションがあったのですね。
これで、ゲーム上の動きとサウンドコードを関連づけることができるので、どのサウンドコードがどの音なのかを特定するのが容易になりました。もはやP1を調べるなど面倒くさいことをせずに済みます。
これがわかったのであれば、サウンドコードから、そのコードにM1上のどのアドレスが対応するかの計算式を探さない手はありません。
KOF2001の時と同じように、法則を見つけて式にしてみました。実際にはM1の2E0Eからの数バイトが手がかりになっています。


<M1の修正個所をサウンドコードから計算する方法>

16進表記での計算なので、Windowsの電卓を関数電卓に切り替え、16進にチェックを入れて計算します。
式はサウンドコードの上2桁選びます。nnは同じくサウンドコードの下2桁、1821なら21、1C0FならFです。


 18nn番台:nn×6+42CB
 1Ann番台:nn×6+4877
 1Cnn番台:nn×6+4E05
 1Enn番台:nn×6+53AB


たとえば、「勝ったにょ」のサウンドコードは1A97なので、97×6+4877=4C01で、修復すべきM1のアドレスは00004C01から。
昨夜出したデータ(00004C01: 20 71 0E 8C 0E DC)と一致します。
これで、KOF2001の復元をしたときと、技術的には同等になりました。KOF2001の時と比べて不利と思われるのは情報の提供量でしょう。このゲームは人気作とは言えないようです。逆に有利なのは、すでに書いたようにデータがわりと順番通りに並んでいる可能性があるということです。




投稿者:NXV >

とりあえず、最初にまどろっこしい方法を書いてしまったので、あらためて手順を整理します。
といっても、KOF2001と同じ修復方法ですから、前回の復元に参加した人には説明不要でしょう。
前回との違いは、すぐ上に書いた計算式だけです。


<Matrimelee 音声修復 手順要約>

<1>
どのキャラクターの、どの動作(局面)の、どういう台詞(サウンド)が抜け落ちているのか調べる。
または、情報提供してもらう。


<2>
Nebulaでサウンドコードを表示しながらゲームをプレイし目的の場面で音が出ていないサウンドコードを調べる。


<3>
<2>で求めたサウンドコードをもとに、計算式で修復すべきM1上のアドレスを求めておく。


<4>
VロムをWav化したファイルを聞き、どのVロムの何秒目で目的のサウンドが聞こえるかを調べる。


<5>
<4>の秒数をもとに計算してVロム上のアドレスのおおよその見当をつけ、バイナリエディタで変換前のVロムを開き、アドレスの範囲を特定。アドレスの値から修復のためのデータ(6バイト中4バイト)を決定する。


<6>
M1ロムをバイナリエディタで開き、<3>で求めたアドレスの周辺にあるバイナリを参考にして<5>の修復データを完成させる。
<3>で求めたアドレスへ修復データを書き込む。


<7>
ゲームを動作させて無事にサウンドが出ていれば成功。




投稿者:NXV >

<発音許可/不許可フラグ>

この情報は推測を含みます(間違っていたらごめんなさい)。

KOF2001の時もそうでしたが、M1のバイナリの中に発音をON/OFFするフラグがあるようです。アドレスは

 ・1800番台 41EB〜
 ・1A00番台 420B〜
 ・1C00番台 422B〜
 ・1E00番台 424B〜


1バイト(8ビット)で、8つのサウンドコードをON/OFFしています。
たとえば、アドレス41EBは00、これはサウンドの1800〜1807の8つがOFFだという意味です。アドレス41EFはFF、サウンドの1820〜27がONという意味です。先に行って、アドレス4228はF8、F8を2進数(ビット)にすると、11111000、サウンドの1AE8〜1AECの5つがONで1AED〜EFの3つがOFFという意味だと思います。
これでわかるでしょうか。
このフラグは各サウンドが修復されているか否かとは関係ないので、修復して音が出ないときはここを疑ってみてください。
たとえば、現状ではアドレス423Aと423Bが00なので、サウンドの1C78〜7Fと、1C80〜87がOffになっています。このサウンドをすべて発音させるにはFFにする必要があります。
ただし、KOF2001のときはどこでもFFでいいかというとそうではなくて、使われていない(プログラム上存在しない)サウンドコードをONにすると不具合が出ることがありました。
フラグは、1n00と、1nEx番台の最後あたり、1nFx番台(nは8、A、C、Eのどれか、xは任意)に気を付けていれば大丈夫だと思います。




投稿者:NXV >

とりあえず、最初にまどろっこしい方法を書いてしまったので、再度あらためて手順を整理します。
といっても、KOF2001と同じ修復方法ですから、前回の復元に参加した人には説明不要でしょう。
前回との違いは、すぐ上に書いた計算式だけです。


<Matrimelee 音声修復 インチキ編>

かなりインチキな修復方法をお教えします。

まず、こちらを

 クララ 一発奥義(1A94)
 00004BEF: 20 FC 0D 32 0E DC「お嫁さんになるんだー」


新規修復データです。これを出した方法の説明です。
Matrimeleeでは、多くのキャラクターで、Vロムにある音声がサウンドコードと同じ順番で並んでいます。
クララのテーブルが並んでいるバイナリを眺めると、Vのアドレスにあたるデータが順番通りに並んでいることに気づきます。実際にVロムをWavで聞くと、サウンドコードの順で聞こえます(ただし、ひとりのキャラクターの中で順番通りというだけです)。
クララは、今日の時点でM1アドレス00004BEFから6バイトが空白(00)でした。サウンドコードで言うと1A94、この部分を前後のサウンドコード該当部分(各6バイト)を含めて書くとこうです。


 20 DB 0D FB 0D DC(1A93)
 00 00 00 00 00 00(1A94)
 20 33 0E 62 0E DC(1A95)


コード1A93の4−5番目のパラメータ FB 0D は、0DFBというデータでVロムの終了アドレス000DFBxxを表すということは前回の説明をお読みのかたやKOF2001の復元に参加されたかたはわかると思います。この0DFBをひとつ増やします。

 0DFC:FC 0D

終わりよりひとつ多いということは、次の始まりですよね?
同様に、コード1A95の2−3番目(33 0E:0E33)こちらはVの開始アドレスですね。これをひとつ減らします。


 0E32:32 0E

始まりよりひとつ少ないということは、前の部分の終わりということです。よって、こうします。

 20 DB 0D FB 0D DC(1A93)
 00 FC 0D 32 0E 00(1A94)
 20 33 0E 62 0E DC(1A95)


最後に20とDCを補って、こうなります。

 00004BEF: 20 FC 0D 32 0E DC

Wavとジュークボックスを聞き、実際にゲームをプレイして裏をとります。クララはこれであっていると思います。
同じようにして出したのがこちらです。


 シシー 勝利(1E2D)
 000054B9: 20 82 3D 9E 3D DC「その程度?」


次の4つは、応用編です。

 大山礼児 ストレスシュート 追加(1AAB)
 00004C09: 18 91 10 B3 10 DD「りゅうきしょうえんざん」


 大山礼児 一発奥義(1AAC-1AAD-1AAE)
 00004C7F: 20 B4 10 C7 10 DD「男」
 00004C85: 20 C8 10 DC 10 DD「大山」
 00004C8B: 20 DD 10 0B 11 DD「ここにあり!」


まず、「男」(1AAC)を出して、そのまま順番で「大山」(1AAD)を出せば、残りの2つは簡単にわかると思います。



[1267] 新豪血寺一族 闘婚 ボイス修正? 投稿者:NK

ある意味質問なのですが、地域をヨーロッパにして、設定のLangageをOtherにすると、一部BGMが変わりキャラもボイスが出なくなりました(例:大山礼児の飛び道具など)。
これはもともとなのでしょうか?




投稿者:NXV >

> 一部BGMが変わりキャラもボイスが
今までもそういうのはいくらでもありましたが、言語設定によって音声のセッティングも変わるようです。
このゲームの場合それが仕様なのか未完成なためなのかは断定はできません。ハードJap-ソフトJapと、ハードUSA-ソフトUSAの組み合わせは似ています。ハートEuro-ソフトOthersだと一部の音が出ないのが目立ちますが、そもそもサウンドコードが割り当てられていないようです。つまり欠けているというよりプログラムが音を出そうとしていません。加えて、Vロムの中にKOF2001の韓国語のような海外仕様と思われるボイスがありません。
このゲームのVロムは、約7割が歌&曲の丸ごとサンプリングに充てられているという非常に贅沢な作りで、結果、スコア(楽譜)データを用意する必要がないので、M1の容量が小さいのです。よって、ボイス部分には無駄と思われるデータがほとんどありません。プロトタイプではないと断定はしませんが、少なくともPまたはVロムのどちらか一方でも製品版からのものであれば、この現象は「仕様である」と言えます。
ただし、その件とは別に、海外仕様の時に(Nebulaでサウンドコードの表示ONにした状態で)サウンドコードが表示されているのにその音が出ている形跡がない、とか、ステージBGMが鳴らないという場合は、そのコード(音)とコード(音)が出るべき場面を指摘していただければ修復してくれるかたの助けになるでしょう。ないかもしれませんが。


投稿者:kei >

> NKさん
確認しましたがどうやらEuro設定だと一切日本語の音声が使用されていない様子です。
本来の音楽は(Japでの音楽は)ほとんどが日本語の歌になっています。一方、Euroではレイジ・オブ・ザ・ドラゴンズの人達の音楽ぐらいしかならないようですね(シシーの音楽は確認していませんが)。
ですから、英語の技と殴り等の一部の叫び声は使用されている様子ですが、日本語の技の音声は全然使われてない様子です。


投稿者:NXV >

ところで、M1のアドレス00005573から10数バイトのあたりに短い曲のアドレスがあります。
第1&6パラメータが00なのでこれを有効な値にしてやると、何か発見があるかもしれません。
使用されるべき曲なのかそうでないのかはわかりませんが。


投稿者:NXV >

ヨーロッパモードでのエンディング曲は「海外仕様」ですね。シシーのBGMは、もともとクラシック音楽なので日本版と同じです。

投稿者:Wolf >

闘婚のサントラの30トラック目にボーナストラックとして「Voice Maniacs (一部海外用スタッフロール)」が収録されてます。
一部海外用スタッフロールって部分から判断すると、海外モード時専用BGM(?)が存在するのかも知れません。


投稿者:NXV >

すいません。エンディング曲じゃなくてスタッフロール曲でした。Wolfさんの言うとおりです。



HTML Editor : Wolf