興味持ってる人がいるようだったので、とりあえず手元でデータ生成に使ってるツール一式をまとめてみました。と言っても、データ生成はほぼほぼarm用のアセンブリでやってます。本来はm68k用を使うべきなんでしょうが、命令を吐く必要がないのでbig endianが指定できればなんでも良いのです。
ツール一式は前エントリのサンプルデータと共に
GitHubにて。
data/ 以下にサンプルデータとデータ生成スクリプトが入ってます。スクリプトはPOSIX環境向けなのでWindowsの人はWSLなりCygwin、MinGWあたりを使って道具を揃えてもらえれば、と。とは言ってもpureなWindows環境向けに同等のツールを揃えることは、ある程度の知識があれば大きな手間はかからないと思います。
生成に使っている開発ツールですが、自分はmac上のbrewでarm-none-eabi-gccを使ってます。Ubuntuでもパッケージでさくっと入れられるかと思いますので、Windowsの人はWSLを使っていれば同様に簡単に環境が揃うかと。
data/gxsnd.S がサンプルデータなので中を覗いてみてください。gxsnd.hっていうヘッダの中で色々とコマンドを定義して、それを使ってアセンブリ言語向けのデータを埋めてく感じです。
先頭の.org 0x00108000はデータを配置するメモリ上のアドレスを表しており、この値はmame向けのテスト環境で前提にしている値です。サウンド用のサブCPU内のアドレスを表しており、このアドレスは沙羅曼蛇2では未使用のRAM領域です。実機で試したい場合には、既存のデータを上書きする形でROM内に配置する必要があります。また、その際にはROMチェックを通るようにチェックサムの辻褄を合わせる必要もあります。このあたりの解析情報も持ち合わせているのですが、今回はこの点については割愛。
続くHEAD:部は、全16チャンネルのデータ位置とデータ末尾を示すラベルで埋めます。この部分はいじらないで下さい。
続けてCH_1からCH_16まで、実際のデータが続きます。各チャンネルのデータは必ずENDで終わらせて下さい。またデータ末尾にも必ずENDが必要です。
データについてはMMLを知っていればある程度推測できる範囲にあるとは思うのですが、わかりにくい部分だけ補足します。
一般的なMMLでは音程と音長を組み合わせてA4などと指定するのが一般的です。またLコマンドで省略時の音長も指定でき、単純にAと書けばラの音が指定できます。一方、このシステムでは、音程に対して、音長、ゲートタイム、音量を合わせて指定するのが基本になります。A4LG(L4,100,127)と書くと、ラの音を100%のゲートタイム、音量最大127で指定する事になります。Aの後の4は音長ではなくオクターブです。また2音目以降はゲートタイム、または音長とゲートタイムを省略可能です。A4LGではなく、A4Lと書けばゲートタイムが省略、A4と書けば音長とゲートタイムが省略され、前回の値が再利用されます。ただし音量は必ず毎回指定する必要があります。この点が少し不便。音量は96が四分音符相当で最大255までしかとれません。よって直接指定するのは二分音符までとし、それより長い場合にはタイ(TIE)で繋いで下さい。タイも音長とゲートタイムを引数に取ります。音調に関しては直接数字で記述しても良いですし、gxsnd.hで定義されているL4などの文字を使っても構いません。付点はL4_などとアンダーバーで表現できます。
ドラムに関してはRHYTHM_ONでリズム音源モードというか。ノート毎に違うサンプリングデータがアサインされてるモードになります。C0からBb2まで、バスドラ数種、スネア数種、シンセタム、生タム、ハット、金物各種、色物系みたいな順で並んでます。そうそう、通常の音色もサンプリング番号+ADSRチックなエンベロープ個別指定になってます。よって沙羅曼蛇2をベースにする限り、沙羅曼蛇2のROMに入ってるサンプリング音色しか使えません。65音色くらいあったと思います。一応音色一覧的なのもあるけど主観で命名してるので環境手に入れたら自分の耳で確認してもらうほうが確か。
各コマンドの値に指定できる値は基本的には0-255の8-bitsの値になります。が、コマンドによって成約もあります。PANは1が左、8が中央、16が右でその間の値もとれます。REVERBは2つの引数ともに0-15までしか取れません。DETUNEに関してはsigned charで-128から127で考えて良いかと思います。
繰り返しについてはREPEAT_START / REPEAT_ENDで囲んで下さい。REPEAT_ENDの第1引数が繰り返し回数です。第2、第3については不明ですが、既知のデータでは0が指定されていました。
ループポイントについてはLOOPコマンドに続けて戻りたい場所のシンボル名を後続の.dc.lラインで指定して下さい。内部的な挙動はマクロ呼出しと同じですが、コマンドは別途アサインされていました。マクロについてはサンプルでは使っていませんが、CALLコマンドに続けて.dc.lでシンボルを指定すると、任意シンボル内のデータを演奏してから呼び出し元に再生位置が戻ります。これらのデータはDATA_ENDより手前、通常はCH_16の後ろに置かれ、他のデータ同様にENDで終了します。
再生環境についてはmameを流用するのが簡単です。とは言っても沙羅曼蛇2のROMを所有している必要がありますので、この点に関しては著作権遵守でお願いします。駿河屋で2万ちょっとが店頭での最安値かな?ヤフオクで見張ればもっと安く手に入ることもありますが、慣れてない人にはおすすめできません。基板環境ない人でもプラス数万払えば実機で演奏する環境も夢ではありませんよ。
mame/mame.diff のパッチをあててmameをbuildする必要があります。あるいはdebugモードで起動すれば本体に手を入れずともデバッガコマンドから再生する事は可能なのですが……実際にデータ作って〜となると面倒でやってられません。このパッチは特定アドレスにデータを読み込むフックをかけてます。実際には0x00800000を叩くとgxsnd.datというファイル名をメモリに読み、サウンドチェック用の曲ヘッダが指す先を読み込んだメモリ上のデータに差し替え、再生用のホストコマンドを入れて割り込みをあげます。
該当アドレスを叩くのはmame/cheat/salmndr2.xmlのcheatを通して行います。mame以下に「cheat 1」と書いたmame.iniファイルを置くとcheat以下の定義が読み込まれ、cheatメニューにLoad GXSND、BGM Test、Loop 1 BGMなどが追加されます。この中のLoad GXSNDを選ぶと該当アドレスが叩かれてデータの再生が始まるはずです。
BGM Test、Loop 1 BGMはおまけ。前者は曲を選んで再生できます。後者は1週目から2週目BGMを再生するハック。
ざっくりこんな感じで。何か質問があればTwitterなどで質問して頂ければ。あと、著作者からの要望があれば、前置きなく解析情報を削除することもあるかと思います。まぁ、68アセンブリ読めれば誰でも数時間でわかるような内容ではありますが。
ちなみにSilver Wings Againに使われているコマンドは0xd0以外は解析できてます。引数の数はコード見ればすぐにわかるんだけど、効果はROM書き換えながら耳で確かめたり、コード見たりでまちまち。0xd0に関しては聴覚上に違いがなかったような気もするけど、mameで確認してる関係上、きちんとエミュレートされてない部分で変化してる可能性も。他の曲でまだ未確認なコマンドだとフルタイムポルタメントとかもありそう。ROM内のサウンドデータを同ツールでbuild可能なソースに変換する解析ツールも作ってあるんだけど、コード適当だし、解析ツールについて権利者がどう思うかもわからないので、今の所公開は考えてません。