English
SOUND Manualサウンドドライバプログラマーズガイド
戻る進む
サウンドドライバプログラマーズガイド

4.サウンドリクエストの具体的な方法


 サウンドドライバの起動方法は、基本的にはサウンドドライバをサウンドメモリへ転送してリセット信号を解除するだけです。但し電源投入時のメモリの内容は保証されていませんので、ゼロクリア等の初期化が必要です。
 サウンドドライバの起動は下記の1から6の手順で行ってください。これでサウンドドライバが起動され、プログラムの先頭から走り出します。SCSP、リセット等ハードウェアの詳細については SCSP,SMPCのユーザーズマニュアルを参照してください。

起動の手順

順番処理内容説明
168000を止める
(サウンドCPUにリセットをかける)
ソフトウェアライブラリ「SMPCインターフェースライブラリ」の「サウンドOFF」を実行する。
2SCSPのレジスタを初期化するSHアドレスの 25B00400 番地にバイトで 02hを書き込む。
(DAC18B=0、MEM4MB=1 の設定となります)
3システム領域をゼロクリアするSHアドレスの 25A00000 番地から 25A0AFFF 番地までをオールゼロクリアする。
4サウンドプログラムをサウンドメモリに転送するSHアドレスの 25A00000 番地からへサウンドプログラム (SDDRVS.TSK)を転送する。
5サウンドエリアマップをサウンドメモリに転送するSHアドレスの 25A0A000 番地からへサウンドエリアマップを転送する。
668000をスタートさせる
(サウンドCPUのリセットを解除する)
ソフトウェアライブラリ「SMPCインターフェースライブラリ」の「サウンドON」を実行する。

備考)
 サウンドエリアマップのサイズは最大でも0x1000バイトですので、サイズがこれより大きくなるような場合には複数のサウンドエリアマップに分割して作成してもらってください。但し、その場合には必要に応じてマップチェンジ(サウンドの再生方法の項に説明があります)の前にサウンドエリアマップの入れ替えを行ってください。

 リクエストコマンドの詳細が把握できていても、実際にどのような手順でコマンドを発行すればよいのかわからないということがしばしば見受けられます。ここでは一般的なリクエスト手順を示しますが、その前にリクエストコマンドバッファの割り当てを決めておくことをお薦めします。SEGAで推奨するコマンドバッファ割り当ては次のようなものです(順番はともかく、役割を分担する)。

0x25A00700サウンドイニシャル、マップチェンジなど重要なコマンド専用
0x25A00710ポーズのon/off専用
0x25A00720PCMストリーム再生のon/off専用
0x25A00730CD-DAコントロール専用
0x25A00740通常効果音の音量リクエスト専用
0x25A00750通常効果音の演奏on/offリクエスト専用
0x25A00760BGMの音量リクエスト専用
0x25A00770BGMの演奏on/offリクエスト専用

 一概にこれが良いとは言い切れませんが、少なくとも、効果音と他のリクエストはバッファを区別することを強く推奨します。なぜなら、サウンドリクエスト関係のトラブルは、そのほとんどが効果音なのです。これは効果音のリクエスト回数がほかに比べ極端に多いことと、コントロールパッドによるリアルタイムなリクエストなので予測できないケースが多いなどの原因によります。また、これを区別することは、他のリクエストに影響を与えないようにする目的以外に、デバッグに費やす時間の短縮にもなります。

 では、ゲームスタートからリクエスト手順の説明を行います。

  1. サウンドプログラムをロードした後、タイミングフラグを使用可能にするために0x25A004E1のビット7を立てます。

  2. 68000をスタートさせます。

  3. サウンドイニシャライズを行います。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x070010--0101010101----------

    以上を書き込み、タイミングフラグを立てます。

  4. マップデータ、サウンドデータを0x25A0A000番地以降へロードし、転送済みフラグを立てます。

  5. マップチェンジを行います。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x070008--nn------------------

    以上を書き込み、タイミングフラグを立てます。

  6. エフェクトチェンジを行います(DSPを使用しないのであれば行う必要はありません)。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x070083--nn------------------

    以上を書き込み、タイミングフラグを立てます。

  7. ミキサチェンジを行います。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x070087--nnnn----------------

    以上を書き込み、タイミングフラグを立てます。

    以上を完了すれば、曲、効果音のリクエストが可能になります。では、次にバンク1にある曲番号2の曲を発音管理番号3でリクエストしてみます。この例ではサウンドクリエータから特に音量の指定がなかったものとします。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x076005--038000--------------
    0x077001--03010200------------

    以上を書き込み、タイミングフラグを立てます。

    このように、通常はシーケンスボリュームコマンドとセットで同一INTに発行すると間違いがありません。では、今度はバンク2にある曲番号3の効果音を発音管理番号7でリクエストしてみます。曲は止めずに効果音を発声させるので、曲と効果音の発音管理番号は異なっていなければなりません。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x074005--048000--------------
    0x075001--04020300------------

    以上を書き込み、タイミングフラグを立てます。

    では次に、現在発音管理番号3で演奏されている曲を止めます。終了モードは0を指定してください。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x077002--0300----------------

    以上を書き込み、タイミングフラグを立てます。

    演奏停止はこれ一発でOKです。コマンドリファレンスをみるとこれ以外にも音を止めるらしきコマンドがありますが、演奏停止はこれだけです。では、今度はフェードアウトして曲を終了させてみます。フェードアウトして行くスピードは0x0Aにしてみます。ほとんどのゲームが大体このくらいです。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x076005--03000A--------------

    以上を書き込み、タイミングフラグを立てます。通常、曲のフェードアウトが完全に終了するまで待っていられないことが多いので、適当なところで演奏終了コマンドを発行します。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x077002--0300----------------

    以上を書き込み、タイミングフラグを立てます。

    ただいま曲を終了させましたが、このあとにオーバーレイ処理によるサウンドデータの入れ替えをするとします。この場合、念のため(ほかの発音管理番号で効果音などのシーケンスが演奏中かもしれないので)、全シーケンス停止を実行します。

    +0+1+2+3+4+5+6+7+8+9+A+B
    0x070006----------------------

    以上を書き込み、タイミングフラグを立て、さらにタイミングフラグがoffになるのを待って、最初に戻り、サウンドイニシャル発行、データロード、マップチェンジ発行、エフェクトチェンジ発行、ミキサチェンジ発行を行います。

 希に、メイン側が発行するリクエストを一旦吸収し、リクエストコマンドバッファを0x10バイトごとのリングバッファに見立てて、発行された順番に書き込んでゆくといったプログラムをSH2で組んでしまうケースがあるようですが、これはゲームによっては大変危険ですので、絶対に行わないでください。コマンドバッファは役割分担するようお願いします!


戻る進む
SOUND Manualサウンドドライバプログラマーズガイド
Copyright SEGA ENTERPRISES, LTD., 1997