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

3.サウンドコントロールコマンド


 コントロールコマンドの発行は下記のコマンドブロックエリアに対して行います。16バイトのコマンドブロックに、コマンドコードと必要なパラメータ(P1--P14)を書き込んでください。コマンドブロックは8ブロックありますので、最大8コマンドまでを同時に発行することができます。

システムインタフェース領域

 サウンドコントロールは動作を指示する「コマンド」とそれに付随する必要な情報として「パラメータ」をホストインターフェース(RAMエリア0x25a00700〜0x25a0077f)へ書き込んでやることによってサウンドプログラムがそれに反応するといった動作手順を踏んでいます。また、再生形態として発音管理番号という8つの仮想ドライバにより、それぞれを別次元で演奏、再生できます。
 ここで大切なことは発音管理番号という概念です。発音管理番号(0〜7)とは8本の演奏を行なうプログラムが、あたかもそれぞれが独立して演奏をしているように見せようと設計されたものです。ただし、実際にはプログラムが別々に8本あるわけではなく、SCSPの限界を超えるような動作はできません。
 たとえば、発音管理番号0でBGMを演奏させます。このBGMを止めたい、あるいはフェードアウトさせたいというときにはこの管理番号0に対してコマンドを発行すればよいわけです。
 各発音管理番号のプログラムはひとつの動作しか実行できません。サウンドリクエストは常に新しいものに対して動作を起こします。つまり、演奏中に効果音を発声させたい場合には現在演奏中の管理番号0以外のプログラムを指定しなければなりません。0番でも効果音は発声しますが、BGMはただちに演奏終了し、次の要求である効果音の発声という処理に切り替わってしまいます。
 このように、処理が独立しているので、複数のBGMを同時に演奏させたり、PCMストリーム再生中に効果音を発声させたりすることが可能となっています。

 ホストインターフェースはだいたい次のようなイメージです。CMD部分にコマンド番号を書き込みます。これについては次のページから詳しく解説します。P1,P2…はパラメータをセットします。パラメータの数はコマンドによって異なります。また、パラメータを必要としないコマンドも存在します。

アドレスCMDP1P2P3P4P5P6P7P8P9P10P11   
0X0700               
0X0710               
0X0720               
0X0730               
0X0740               
0X0750               
0X0760               
0X0770               
 *2バイト目は使用しません。

 コマンドの発行方法には、「タイミングフラグハンドシェイク」と「コマンドコードハンドシェイク」の2種類の方法があります。タイミングフラグハンドシェイクとはメインシステムの書き込んだコマンドの順番が確実に再現されるように考慮されたコマンドの発行方法です。但しコマンドコードハンドシェイクは、サウンドドライバ Ver1.00 から Ver1.29 までの互換用ですので、通常はタイミングフラグハンドシェイクの方を使用してください。コマンドコードハンドシェイクですと連続リクエストに68000が間に合わず、トラブルが発生することがあるためです。これについては後述します。
 タイミングフラグハンドシェイクは次のようにして設定します。

0x25A004E1へバイトで0x80を書き込み68000をスタート

 タイミングフラグを使ったコマンドの発行は次の要領で行います。

メインシステムの処理(コマンドの発行)

  1. タイミングフラグ(0x25A004E0の第7ビット)が「0」なら、コマンドブロックにコマンドを出したい分だけ書き込む(最大8コマンドまでで、コマンドブロックは間をあけて使用してもも良い)。
  2. タイミングフラグを「1」にする。
サウンドドライバの処理(コマンドの引き取りと実行)
  1. タイミングフラグが「1」なら、コマンドブロック1から順番にコマンドの実行を開始する。  (コマンドブロックは1から8へと順番に実行され、コマンドコードが「00h」のブロックはなにもしないで次のブロックへと進む)
  2. コマンドの実行が終わったコマンドブロックはコマンドコードを「00h」にもどす。
  3. コマンドブロック8までの処理が全て終わったら、タイミングフラグを「0」にもどす。

ビット 76543210           
    *・・・・・・・           
    ↑                  
    |                  
    タイミングフラグ 0:Id1e     
             1:コマンドセット完了
 タイミングフラグモードは、一度でも設定を行なってしまうと、元へ戻すことができません。これを元へ戻したい場合にはサウンドドライバを再ロードする以外に方法はありませんので注意してください。また、特にシネパックがタイミングフラグモードに対応していないということに注意してください。タイミングフラグモードのままにしておくと、シネパック部分で確実にストップしてしまいます。ゲーム中にシネパック+内蔵音源という組み合わせを用いるゲームにおいてはタイミングフラグビットを強制的に降ろしてやるか、タイミングフラグモードを使用しないという方法しかありません。
 ソフトウェアライブラリを使用している場合には、タイミングフラグをセットするための関数は用意されていませんが、これはライブラリ関数が内部で自動的に処理しているためです。SGLの場合、自動的にタイミングフラグモードになりますが、SBLの場合にはなにもしません。

 次にコマンドコードハンドシェイクについても触れておきます。
 コマンドコード(コマンドブロックの先頭の1バイト目)が「00h」であるかをチェックしてコマンドを発行する方法です。メインシステムはコマンドコードが「00h」であることを確認して、ブロック1からブロック8までの順番を守ってコマンドを発行します。サウンドドライバも同様に、ブロック1からブロック8までを順番にチェックして、コマンドコードが書かれていたらそのコマンドを処理するという動作を単純に繰り返します。
 コマンドコードは処理が終わった時点でサウンドドライバによってクリアされますので、コマンドコードがまだ「00h」にクリアされていない場合は、まだコマンドの処理中であるか処理の開始待ちの状態であることを意味します。逆に発行したコマンドコードが「00h」にクリアされたということは、サウンドドライバのコマンド処理が完全に終了したということを意味します。しかし、コマンド発行側のミスで、リクエストを受け取ったサウンドドライバがコマンドコードを0クリアする前に次のリクエストが書き込まれてしまった場合、新しいほうのコマンドコードを0にしてしまう可能性があります(ver-2.04ではこの現象に対してある程度の対策を施していますが、SH2と68000にかなりの速度差がある以上、完全に防ぐことはできません)。
 ゲームがコントロールパッドを使用したリアルタイムなものであるという性質上、コマンドコードハンドシェイクによって起こるトラブルはそのほとんどが効果音なのです。代表的なものとして「たまに効果音が出ないことがある」などの現象がよく発生するようです。十分注意してください。
 コマンド発行時にはコマンドパラメータを全て書き込んだ後に、最後にコマンドコードを書き込んでください。サウンドドライバはコマンドコードを検出するとすぐにコマンドパラメータを引き取りますので、最初にコマンドコードを書き込むと予期せぬコマンドパラメータで処理が行われる場合があります。
 サウンドドライバはブロック1からブロック8までを順番にチェックしていますから、単に空きブロックを探してコマンドをセットすると、メインシステムの書き込んだ順番とは違った順番でコマンドが実行される場合があります。実行順序が入れ替わるとシステムが誤動作する場合がありますので、実行順序が決まっているような処理を実行する場合には順番が入れ替わらないようにコマンドをセットしてください。
 本手順ではメインシステムとサウンドドライバは非同期に処理を行っていますので、上記注意事項を守ってもコマンド順が入れ替わってしまう場合があります。実行順序を守る必要がある場合にはコマンドブロックをひとつだけ使って、前のコマンドが処理されたことを確かめてから次のコマンドを発行するという方法でこれを回避してください。


コマンド一覧

01H SEQUENCE START曲、効果音の演奏開始
02H SEQUENCE STOP曲、効果音の演奏停止
03H PAUSE曲、効果音の一時停止
04H PAUSE OFF曲、効果音の一時停止を解除
05H SEQUENCE VOLUME音量調整またはフェードイン/アウト
06H STOP ALLすべての演奏停止
07H TEMPO CHANGE曲、効果音のテンポを変える
08H MAP CHANGEマップチェンジを行なう
09H DIRECT MIDI CONTROLMIDIイベントをコマンドとして送る
0AH START VOLUME ANALYZERDigital Audio Inの入力レベル解析開始
0BH STOP VOLUME ANALYZERDigital Audio Inの入力レベル解析終了
0CH DSP STOPDSPの停止、初期化
0DH ALL NOTE OFF全発音停止
0EH SEQUENCE PANゲーム上からPANPOTをコントロールする
10H SOUND INITIALIZEサウンドドライバの初期化を行なう
11H YAMAHA 3D CONTROLYAMAHA 3D soundのコントロール
12H QSOUND CONTROLQsound コントロール
13H YAMAHA 3D INITIALIZEYAMAHA 3D,Qsound 定位の初期化
14H TEMPO MODEテンポモードの設定
15H TEMPO RATIO相対テンポ値の設定
80H CD-DA LEVELCD-DAのレベルを調整
81H CD-DA PANCD-DA出力Panpotの設定
82H TOTAL VOLUMEトータルボリュームの設定
83H EFFECT CHANGEエフェクトの切り換え
85H START PCM STREAMPCMストリーム再生開始
86H STOP PCM STREAMPCMストリーム再生停止
87H MIXER CHANGEミキサの切り換え
88H MIXER PARAMETER CHANGEミキサパラメータの切り換え
89H HARDWARE CHECKハードウェアのチェック
8AH PCM PARAMETER CHANGE再生中のPCMストリームに対してのパラメータ切り換え
8BH PCM SLOT ALLOCATIONPCMストリーム用のスロットを確保する
8CH PCM SLOT RELEASEPCMストリーム用スロットを解放する

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