メガドラ開発:MDSDRVについて
前回、SGDKで使用できるサウンドドライバとしてMDSDRVを紹介しました。今回はMDSDRVをSGDKで使用する流れを書きたいと思います。
ダウンロードする
MDSDRVのGitHubから最新版をダウンロードしてください。
とりあえず適当に解凍してください。MDSDRV-masterフォルダを開くと、いろいろ入ってますね。
dataフォルダ以下は自身のゲームで使用したいBGMやSEのためのMML、及びPCMを配置するためのフォルダです。
とりあえずはサンプルデータが入ってますので、それをビルドしてみましょう。MDSDRV-masterフォルダ内にあるbuild.batを実行します。outフォルダができ、その中にバイナリやヘッダなどが出力されるはずです。また、SGDK向けにMDSDRV-master/sample/sgdk/以下にもコピーされます。
出力されたファイルのうち以下のものを自身のプロジェクトにコピーしてください。()内はファイルが入っている場所、[]内は自身のプロジェクトフォルダへのコピー先です。
mdsdrv.bin (sample/sgdk/res) [res]
mdsseq.bin (sample/sgdk/res) [res]
mdspcm.bin (sample/sgdk/res) [res]
mdsdata.res (sample/sgdk/res) [res]
mdsseq.h (sample/sgdk/res) [inc]
mdsdrv.h (sample/sgdk/inc) [inc]
mdsdrv.c (sample/sgdk/src) [src]
MDSDRVの組み込み
次にSGDK上での実装ですが、すでにSGDKのサウンドドライバがZ80メモリ上にあると不具合を起こす可能性があるので、Z80_unloadDriver()でクリアします。次にMDS_init( const u8* seqdata, const u8* pcmdata)を実行。引数はseqdataとpcmdataはmdsdata.res内のシーケンスデータとPCMデータを設定してください。
また、毎フレーム更新処理を実行する必要があるため、VBlankの割り込み関数にでもMDS_update()を追加しましょう。
音を鳴らすにはMDS_request(u16 slot, u16 id)を実行します。slotは0-3までの優先値を設定しますが、mdsdrv.hにある定数(MDS_BGM、MDS_SE1、MDS_SE2、MDS_SE3)をセットするのが良さそうです。idにはmdsseq.h内で定義されている各音データのidをセットします。
その他の機能についてはdoc/api.mdを参考にしてください。特にMDS_command(u16 id, u16 param)はいくつかの機能を持った便利な関数です。idに実行したい処理を入れ、paramに値を設定します(引数が多いMDS_command2もあります)。SEでPCMを3チャンネル再生する際には、set_pcmmode(0x11)であらかじめ設定しておく必要があるので忘れないようにしましょう。
MMLの記述方法について
この辺は専門外なのでさっぱりわかりません。同じくIan Karlsson氏が開発しているmmlguiを使うと良さそうです。
パスに日本語が入ってるとうまくセーブされないっぽい? ご注意を。
応用的な使い方
デフォルトではMDSDRVはプログラムの最後尾にリソースを配置します。PCMを多用するとどうしても容量を圧迫しますので、場合によってはバンクに入れる必要があるでしょう。その際にはmdsdat.resにALIGN 524288を追加し、各バイナリの配置をFARにすれば(sgdk/bin/rescomp.txtを参照)バンク内に入れることも可能です(デフォルトではFALSEになっていますので注意)。以前も書きましたが、SYS_getFarData()を使用すると0x300000 - 0x3FFFFF内のバンクをバンバン変えてしまいますので、SYS_getFarData()を使用している方は0x200000 - 0x2FFFFFに配置するのが無難でしょう(つまりMDSDRVをバンクに収める際にはSYS_setBank()で設定する)。
初期化時にmdsseqdataやmdspcmdatのアドレスは自分で設定しますので、これらは有効なアドレス値がわかれば問題ありません。ですがmdsdrvdatは設定していないため、ロム内のアドレスがアクセスできる範囲である必要があります。具体的には0x400000以降に配置されてしまうとフリーズしてしまいます。バンクの前半に入るようにファイル名を調整するか、容量的な問題(約8KByteあります)がなければmdsdrvdatだけはプログラムの最後尾に配置した方が良さそうです。つまりmdsdata.resのmdsdrvdatとmdsseqdatの間にALIGN 524288を記述します。同様にmdsseqdatとmdspcmdatがロムの0x400000以降にある場合は、初期化時にバンク内のアドレス値を計算してセットしてください。
実験してみたところ、複数のバンクに音データを入れて切り替えて使用することも可能でした。ただ、曲やSEを再生中にバンク切り替えるのは危険ですので、しっかりと停止させて確実に再初期化する必要がありそうです。また、SEとBGMのアドレスが個別に指定できるわけではありませんので、同じSEを重複して登録しておく必要があります。
この記事が気に入ったらサポートをしてみませんか?