qSPC 2.0 (ほぼ)完成
qSPC進捗
クイックロード(勝手に決めた用語)実装
64KBのサウンドドライバを丸々入れ替えると2秒ぐらい待たされるので、シーケンスが入っている先頭付近(もうちょっと削れるけど今のところ8KB)だけを入れ替える機能。当然、サンプリングデータは全曲で共通でないとぶっ壊れるので、条件を満たしている場合のみROM内に「クイックロード可」のフラグを立てておく機能をコンパイラに実装している。
ところで、一番苦労した箇所が……ロード時にSpinner(風車みたいなアイコン)を表示する処理。無くてもいいだろ!って言われそうだけど、スーファミ時代に無かった(と思う)UIが表示されるのは面白いかなと思ったのでなんとか実装した。
なぜ苦労したか? どうもPPU(グラフィック)とSPC(サウンド)へのアクセスは競合するらしく、画面更新をVBLANK割り込みで処理したままSPCにアクセスすると、データが不規則にぶっ壊れるのである。残念ながら回路図までは読めないんだけど、エミュレータのソースを見る限り、何か悪いことが起きそうなことだけは確かだった(特にDMA/HDMAが怪しい)。ということで、SPCへの転送中は割り込みを止めて、レギュラーの処理で画面を更新している。
進捗
MMLコンパイラ(qSPC2)
土日でまあまあがっつり、進めた。
シーケンスデータをドライバへの埋め込む部分を主に実装し、次は音色データ周り。
ここは大きく変えようと思っている部分で、なぜかというと旧版は「insts」という固定のフォルダにbrr(SFC用の音声サンプリングデータ)を入れておくとそれが使われる、という仕様だったけど、これだと楽器セットを変えようと思うとフォルダの中身を丸ごと入れ替えないといけない。
よく考えると楽器セットは曲に付随するものなので、曲データの中から自由に指定できた方がいいなということで
#using "jazz" @0 cdefgab
などとすると「jazz」フォルダの中にあるbrr一式(+設定ファイル)が使われるという仕様にした。ADSR等をMML中に無理に書く必要もないなということで、設定ファイルの中に移動。
とりあえず音が出るところまで進めたら、曲を複数持って入れ替える機能(アルバム機能と呼んでいる)の設計をするという流れで。
進捗
MMLコンパイラ
エラー処理を実装し、旧バージョンよりまともなエラーメッセージが出てくるように。
cde2{aaa{a}}
などと入力すると
At line 1, column 9 連符を多重にすることはできません
といった具合。どうせ当面日本人しか使わないんだし日本語にしといた。ロケールで英語に切り替えるとかもできるけど……まあ後でいいでしょう。
あとは、シーケンスデータをドライバに埋め込む時に、ドライバのソース(Originの指定)を見て埋め込み位置を拾うようにした。せっかくregex使えるんだからこれぐらい気の利いたことをやっていいだろうと。ただ最終的には、ドライバじゃなくてホスト(S-CPU)側のプログラムにシーケンスを持たせて、動的にSPCに送り込むようにしないといけないんだよね。そうしないと複数の曲を鳴らせないので……