じぇみに広野氏が語るレトロゲーム機のPCM再生技術

元コンパイルの開発者、じぇみに広野氏(@jeminilog/@kopandacco)が語る各種レトロゲーム機のPCM再生技術に関するツイートをまとめました。 (1)メガドライブのPCM再生技術 (2)ゲームボーイのPCM再生技術 (3)スーパーファミコンのPCM再生技術 (4)ファミコンのPCM再生技術 続きを読む
49

(2)ゲームボーイのPCM再生技術

ぱんどら @kopandacco

ロストテクノロジーもいっこ。ゲームボーイでゲームを動かしながらサンプリング再生する方法。

2014-02-07 19:46:55
ぱんどら @kopandacco

「動かしながら」じゃないなら割と簡単で、CPUが100%貼りつくだけ。ただしGBのサウンドは音量を操作するとノイズが乗るというやや問題がある仕様なので、MSX版魔導物語みたいに簡単にはいかない。

2014-02-07 19:47:06
ぱんどら @kopandacco

MSXでのサンプリング再生は、AY-3-8910をD/Aコンバータ代わりに駆動すれば良かったけど、同じことをGBでやると、聞いてる人がX星人化しそうなノイズになるのがオチ。

2014-02-07 19:47:18
ぱんどら @kopandacco

幸いGBのCH-3は他のチャンネルと仕様が違い、音量を変えてもノイズでが出ない。でもその代り、音量は16ではなく4段階。てことは、このチャンネルで再生できるのは2bitまで

2014-02-07 19:47:34
ぱんどら @kopandacco

ゲームが止まったままの音声再生でも需要はありましたが(前述の魔導とか)ぷよぷよはそれじゃ困る。という訳でなんとか並行動作したい。タイマー割り込みはないのか。はいあります、実は。

2014-02-07 19:47:46
ぱんどら @kopandacco

でもタイマー割り込みは、通信で使ってたんですよねえ。音声が出る時は通信しないとか、通信プレイは音声無しとかの排他仕様ならいいけど、それは嬉しくない。

2014-02-07 19:47:59
ぱんどら @kopandacco

結局サンプリングで使えそうなほど割り込みレートを上げたうえで、通信での使用時はそっちにもフックするという面倒くさい実装になりました。

2014-02-07 19:48:07
ぱんどら @kopandacco

結局、GBぷよ3にはギリギリ間に合いませんでした。バグが1つ取れなくて。ROM内に音声データは入ってるんですが。なお初代GBだと再生中はCPUパワーが70%持っていかれるのでちょっと使いどころがシビア。

2014-02-07 19:48:19
ぱんどら @kopandacco

GBぷよ4リリースまでには、さすがにバグは取れてたので実装。結局これが、採用された唯一のタイトル。GBCはCPUが単純に倍速いので、パワー占有率は35%に低下しています。

2014-02-07 19:48:29
ぱんどら @kopandacco

そして以後はもうGBAに世代が変わる。GBAはハード的にサンプリング再生積んでるので、当然音質もそっちのが良く、例の技術を使う必然性ナッシング。短い命だった。 もっと早く編み出せてたら、また違ったのかもしれないけど。

2014-02-07 19:48:39
ぱんどら @kopandacco

で、なんで通信にタイマ割り込みを使うかと言いますと、いや、俺は使ってないぞーって人もいると思いますが。GBは通信完了の感知方式がちょいと特殊でして。

2014-02-07 19:48:48
ぱんどら @kopandacco

相手がこっちからの通信を受け取ったかどうかの確認ができない。自分への通信も終わったのだから、相手も終わったはず、というあやふやな根拠で処理するしかない。

2014-02-07 19:49:00
ぱんどら @kopandacco

ところが、GBにもスプライト転送DMAがあるんだけど、このDMA実行中は一切他の事ができなくなる。つまり通信の受信時にDMAを実行してると、反応ができない。

2014-02-07 19:49:08
ぱんどら @kopandacco

通信相手からは、こっちが反応できる状態かどうか識別する手段がない。たとえば1フレームに1回しか通信しないなら、確実に受け取ってるはずとみなして処理できますが、それじゃ速度が遅いよね。

2014-02-07 19:49:15
ぱんどら @kopandacco

それで私の場合、通信終了後、相手が反応できないであろうワーストケースを想定した時間を余分に待ち、それから次のデータを送るという処理を組んだ。この時間待ちにタイマー使ったんですね。

2014-02-07 19:49:23
ぱんどら @kopandacco

他にもっといい手があったかもしれないけど、GBの通信サンプルとか手元になかったからなあ。ナイスな手があったのならおしえて。まあいずれにしてもロストテクノロジーですが。今更GBで通信組まん。

2014-02-07 19:49:31

(3)スーパーファミコンのPCM再生技術

ぱんどら @kopandacco

サンプリング絡みでもういっこ。SFCはサウンド用CPUのメモリ空間が、本体CPUと分離してます。8bitCPUなんで64kbytes。

2014-02-07 20:17:50
ぱんどら @kopandacco

メガドラと似てるようで異なります。メガドラはZ80に専用のRAMを8KB積んだうえで、68000側のメモリカートリッジにもアクセス可能。つまり8MBのカートリッジならZ80も8MB使用できる。

2014-02-07 20:18:08
ぱんどら @kopandacco

実装の制限のせいで不自由な事はあっても、原理的にはサウンドデータの制限はないも同然。いよっお大臣。なおシングルCPUのPCエンジンにもメモリ的な制限はありません。

2014-02-07 20:18:16
ぱんどら @kopandacco

SFCの場合はサブCPUは完全に分離しており、そのメモリに外部からアクセスする手段はなし。サブCPUから外部のメモリを触る方法もない。

2014-02-07 20:18:36
ぱんどら @kopandacco

じゃあどうするかというと、サブCPUには専用のブートプログラムがあり、最初はそれが起動してる。そのプログラムを使って、まずはサウンドプログラムを転送する。

2014-02-07 20:18:44
ぱんどら @kopandacco

共有メモリなんてないので、4バイトのFIFOメモリを使ってちまちまやりとりするしかありません。転送が終わったら、そのプログラム起動。

2014-02-07 20:18:51
ぱんどら @kopandacco

でもやる事は同じ。今度は自前のプログラムを使うだけで、結局4バイトのFIFOで必要なデータをちまちま転送。受け取ったらやっと演奏開始。

2014-02-07 20:19:01