Hello, my name is pornanime.

qSPC進捗

クイックロード(勝手に決めた用語)実装

64KBのサウンドドライバを丸々入れ替えると2秒ぐらい待たされるので、シーケンスが入っている先頭付近(もうちょっと削れるけど今のところ8KB)だけを入れ替える機能。当然、サンプリングデータは全曲で共通でないとぶっ壊れるので、条件を満たしている場合のみROM内に「クイックロード可」のフラグを立てておく機能をコンパイラに実装している。

ところで、一番苦労した箇所が……ロード時にSpinner(風車みたいなアイコン)を表示する処理。無くてもいいだろ!って言われそうだけど、スーファミ時代に無かった(と思う)UIが表示されるのは面白いかなと思ったのでなんとか実装した。
なぜ苦労したか? どうもPPU(グラフィック)とSPC(サウンド)へのアクセスは競合するらしく、画面更新をVBLANK割り込みで処理したままSPCにアクセスすると、データが不規則にぶっ壊れるのである。残念ながら回路図までは読めないんだけど、エミュレータのソースを見る限り、何か悪いことが起きそうなことだけは確かだった(特にDMA/HDMAが怪しい)。ということで、SPCへの転送中は割り込みを止めて、レギュラーの処理で画面を更新している。

qSPC進捗

目標通り、曲入れ替え(というかドライバ丸ごと入れ替え)機能を実装。
但しプレイヤー・ドライバのみの実装で、コンパイラ側の対応は今から。

↓実機キャプチャ

64KB丸ごと入れ替えるとこのように2秒程度かかってしまうので、ゲームに組み込む場合は、シーケンスがある先頭の数KBだけ入れ替えるモードを用意する予定(もちろん音色データを共用していることが前提)

近況

SFCMMLコンパイラ/ドライバ qSPC2

土日がっつりやろうと思ったが土曜は頭痛がひどくて実質一日稼動。
旧バージョンもそうだけど、以下の3つの処理系が連携しているので

まずこれらを連携させる作業をして、ドライバ本体を……ちょっと触ったところで終了。今週末には簡単な演奏ができるかな?

Nintendo Switch

予約していないので、フィーバーが収まるのを待っている状態。
ただ待ってるのもなんなので、VCでゼルダでもやりましょう。
f:id:gyuque:20170306150801j:plain
ゼルダというかリンクの冒険。一作目みたいなアクションRPGかと思ったらほぼ完全なアクションゲームなのねこれ。しかもロックマンも真っ青(ロックマンだけに)の激烈な難しさ。ディスクシステムのソフトはちょっとおかしいやつが多いのか?マリオ2とか……

進捗

MMLコンパイラ

f:id:gyuque:20170228021633p:plain

シーケンスデータ、音色関係の各テーブル、BRR本体、と出力関係の実装が揃ったので、ようやくドライバ(SPC700側)の開発に戻れるかなというところ。3月中にアルバム機能までいければ上出来かな?

せっかくパーサの実装を綺麗にしたので、余裕があればパラメータ付きマクロなんかも入れたい(これがあるとピコカキコの曲を楽に突っ込めるので)
でもピコカキコってFlash使ってるしそろそろ死にそうだよね。さすがに投稿データまで消したら袋叩きだろうから、それは残ると思うけど。

進捗

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に送り込むようにしないといけないんだよね。そうしないと複数の曲を鳴らせないので……

現況

スーファミ開発

f:id:gyuque:20170131225459p:plain
MMLパーサ、最低限できたので次はドライバへのデータ埋め込み部分の改良へ。さすがに2回目の実装なので今のところ綺麗にできている(マクロとか入れたら汚れるかも)

絵を自動で塗る例のやつ

http://paintschainer.preferred.tech/
せっかく絵の練習してるんだし投入してみた。NEW GAME!の涼風青葉です。

f:id:gyuque:20170131225328p:plain

ご存知の通り、本当はこういう色
f:id:gyuque:20170131234138p:plain

金髪にされてしまった。

思うに、涼風青葉の生来の髪色は金髪だったんだけど、長年まんがタイムきららを読み続けて一千数百億個あった脳細胞が三十個ぐらいまで減ってしまった人達でも名前を覚えやすいよう、髪を青っぽく染め、青いスーツで「どうも、私が涼風葉です」とやっているわけだ。なんという優しさ。でも人工知能はそんな心配りを微塵も理解しないので無粋に「お前金髪だよな?」とか言うわけ。

という理由かどうかはともかく、面白いので敢えてこれに従ってヒント情報付加+手作業での修正を経て、なかなかそれらしい結果を得た。

f:id:gyuque:20170131225420p:plain

鉛筆で描いた絵がこうなるなら便利かも。本当に慣れてる人は同じ時間で手塗りしちゃうかもしれないけど。