順番 | 処理内容 | 説明 |
---|---|---|
1 | 68000を止める (サウンドCPUにリセットをかける) | ソフトウェアライブラリ「SMPCインターフェースライブラリ」の「サウンドOFF」を実行する。 |
2 | SCSPのレジスタを初期化する | SHアドレスの 25B00400 番地にバイトで 02hを書き込む。 (DAC18B=0、MEM4MB=1 の設定となります) |
3 | システム領域をゼロクリアする | SHアドレスの 25A00000 番地から 25A0AFFF 番地までをオールゼロクリアする。 |
4 | サウンドプログラムをサウンドメモリに転送する | SHアドレスの 25A00000 番地からへサウンドプログラム (SDDRVS.TSK)を転送する。 |
5 | サウンドエリアマップをサウンドメモリに転送する | SHアドレスの 25A0A000 番地からへサウンドエリアマップを転送する。 |
6 | 68000をスタートさせる (サウンドCPUのリセットを解除する) | ソフトウェアライブラリ「SMPCインターフェースライブラリ」の「サウンドON」を実行する。 |
備考)
サウンドエリアマップのサイズは最大でも0x1000バイトですので、サイズがこれより大きくなるような場合には複数のサウンドエリアマップに分割して作成してもらってください。但し、その場合には必要に応じてマップチェンジ(サウンドの再生方法の項に説明があります)の前にサウンドエリアマップの入れ替えを行ってください。
リクエストコマンドの詳細が把握できていても、実際にどのような手順でコマンドを発行すればよいのかわからないということがしばしば見受けられます。ここでは一般的なリクエスト手順を示しますが、その前にリクエストコマンドバッファの割り当てを決めておくことをお薦めします。SEGAで推奨するコマンドバッファ割り当ては次のようなものです(順番はともかく、役割を分担する)。
0x25A00700 | サウンドイニシャル、マップチェンジなど重要なコマンド専用 |
0x25A00710 | ポーズのon/off専用 |
0x25A00720 | PCMストリーム再生のon/off専用 |
0x25A00730 | CD-DAコントロール専用 |
0x25A00740 | 通常効果音の音量リクエスト専用 |
0x25A00750 | 通常効果音の演奏on/offリクエスト専用 |
0x25A00760 | BGMの音量リクエスト専用 |
0x25A00770 | BGMの演奏on/offリクエスト専用 |
一概にこれが良いとは言い切れませんが、少なくとも、効果音と他のリクエストはバッファを区別することを強く推奨します。なぜなら、サウンドリクエスト関係のトラブルは、そのほとんどが効果音なのです。これは効果音のリクエスト回数がほかに比べ極端に多いことと、コントロールパッドによるリアルタイムなリクエストなので予測できないケースが多いなどの原因によります。また、これを区別することは、他のリクエストに影響を与えないようにする目的以外に、デバッグに費やす時間の短縮にもなります。
では、ゲームスタートからリクエスト手順の説明を行います。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0700 | 10 | -- | 01 | 01 | 01 | 01 | 01 | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0700 | 08 | -- | nn | -- | -- | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0700 | 83 | -- | nn | -- | -- | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0700 | 87 | -- | nn | nn | -- | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
以上を完了すれば、曲、効果音のリクエストが可能になります。では、次にバンク1にある曲番号2の曲を発音管理番号3でリクエストしてみます。この例ではサウンドクリエータから特に音量の指定がなかったものとします。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0760 | 05 | -- | 03 | 80 | 00 | -- | -- | -- | -- | -- | -- | -- |
0x0770 | 01 | -- | 03 | 01 | 02 | 00 | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
このように、通常はシーケンスボリュームコマンドとセットで同一INTに発行すると間違いがありません。では、今度はバンク2にある曲番号3の効果音を発音管理番号7でリクエストしてみます。曲は止めずに効果音を発声させるので、曲と効果音の発音管理番号は異なっていなければなりません。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0740 | 05 | -- | 04 | 80 | 00 | -- | -- | -- | -- | -- | -- | -- |
0x0750 | 01 | -- | 04 | 02 | 03 | 00 | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
では次に、現在発音管理番号3で演奏されている曲を止めます。終了モードは0を指定してください。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0770 | 02 | -- | 03 | 00 | -- | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
演奏停止はこれ一発でOKです。コマンドリファレンスをみるとこれ以外にも音を止めるらしきコマンドがありますが、演奏停止はこれだけです。では、今度はフェードアウトして曲を終了させてみます。フェードアウトして行くスピードは0x0Aにしてみます。ほとんどのゲームが大体このくらいです。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0760 | 05 | -- | 03 | 00 | 0A | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。通常、曲のフェードアウトが完全に終了するまで待っていられないことが多いので、適当なところで演奏終了コマンドを発行します。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0770 | 02 | -- | 03 | 00 | -- | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立てます。
ただいま曲を終了させましたが、このあとにオーバーレイ処理によるサウンドデータの入れ替えをするとします。この場合、念のため(ほかの発音管理番号で効果音などのシーケンスが演奏中かもしれないので)、全シーケンス停止を実行します。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | |
0x0700 | 06 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
以上を書き込み、タイミングフラグを立て、さらにタイミングフラグがoffになるのを待って、最初に戻り、サウンドイニシャル発行、データロード、マップチェンジ発行、エフェクトチェンジ発行、ミキサチェンジ発行を行います。