# サウンドモジュールの操作

## サウンドモジュールについて

Dreamcastでは音の発音方法（以後音源もしくはサウンドモジュール）には4種類の発音法があります．

### MIDI音源

一般的なシンセサイザに近い構成になっています．通常はMIDIプログラムバンク（音色群）とMIDIシーケンスバンク（演奏データ群）を利用して音声の再生を行います．また，SH-4上でMIDIメッセージを発行して音声を再生することも可能です．

### ワンショット音源

簡単に言うとワンショットバンクに登録された音声のデータ番号を指定して音声を再生する方式です．比較的サウンドCPUの負荷も少ない方式です．

### PCMストリーム音源

操作の難しい音源で，サウンドメモリ上にリングバッファを用意し，そこに適切なタイミングで波形をダウンロードすることにより長時間の音声を再生する方式です．サウンドライブラリはGD-FSにアクセスしないことを前提に作られているので，GD-FSから簡単に再生という方法は現在用意されていません．

### GD-DA音源

GD-ROM上のデジタルオーディオトラックの音声を再生する音源です．実際の再生コントロールはGD-FSを利用します．サウンドライブラリは主にGD-DAから出力されるデジタルオーディオのボリューム・元々の左右のパンポットを再設定（例えば真中に寄せたり）するときに使用します．

## サウンドモジュールを操作するには

サウンドモジュールをサウンドライブラリでコントロールする場合のAPIは主に下記のAPIを使用します．

サウンドモジュールコントロールイメージ図

????の部分にはそれぞれ`Midi`，`Shot`，`Pstm`，`Gdda`（それぞれMIDI・ワンショット・PCMストリーム・GD-DA）があてはまり，それぞれの音源に対してのコントロールになります．
音声の実際の流れは

1. サウンドデータプレイヤが（`sd????SetSpeed`にて再生スピードの影響を受けつつ）デジタルオーディオを発生します．
2. `sd????SetVol`にてボリュームの影響を受けます．
3. FX出力・ダイレクト出力にデジタルオーディオは分配します．
4. FXは`sd????SetFxCh`（MIDI・GD-DA音源以外に存在）・`sd????SetFxLev`（GD-DA音源以外に存在）にてDSPの入力に接続・DSPの入力レベルの設定をします．GD-DA音源はサウンドクリエイタが作成したFXプログラムデータの内容に影響されます．
5. ダイレクトレベルは`sd????SetDrctLev`にてボリュームの影響を受け，`sd????SetDrctPan`にてさらにパンポットの影響を受け出力されます．

## 各APIの説明

各APIの簡単な説明を下記に記述します．

### サウンドモジュールコントロールAPI

実際の引数などはリファレンスのサウンドモジュールコントロールAPIを参照下さい．

#### `sdMidiPlay`，`sdMidiStop`，`sdShotPlay`，`sdShotStop`，`sdPstmPlay`，`sdPstmStop`

Play・Stopはそれぞれ音源に対応するサウンドデータプレイヤの再生開始・停止を行います．このAPIを使用することによりサウンドクリエイタが作成したサウンドデータを再生・停止することが可能です．

#### `sdMidiPause`，`sdMidiContinue`

`sdMidiPause`・`sdMidiContinue`はMIDI音源に対応するサウンドデータプレイヤの再生の一時停止・一時停止解除を行います．ワンショット・PCMストリームはハードの制約上出来ません．

#### `sdMidiSetVol`，`sdShotSetVol`，`sdPstmSetVol`，`sdGddaSetVol`

音源のボリュームを設定します．ここで設定する値は`sd????SetFxLev`および`sd????SetDrctLev`に影響します．例えばここで小さな値（例えば`-007FH`）を指定するとサウンドデータプレイヤで発生したデジタルオーディオが`sd????SetFxLev`および`sd????SetDrctLev`に来る以前に無音状態と等価になるので音声が聞こえない可能性があります．

#### `sdMidiSetPan`，`sdShotSetPan`，`sdPstmSetPan`，`sdGddaSetPan`

音源のパンポットを設定します．FXのパンポットは変化しません．つまりダイレクト音のみパンポットが移動します．

#### `sdMidiSetPitch`，`sdShotSetPitch`，`sdPstmSetPitch`

音源のピッチを設定します．ワンショット・PCMストリーム音源は再生スピードを設定するAPIである`sd????SetSpeed`の影響を受けます（スピードが前後します）

#### `sdMidiSetSpeed`，`sdShotSetSpeed`，`sdPstmSetSpeed`

音源で再生しているサウンドデータの再生スピードを設定します．これはサウンドデータプレイヤにのみ関係あるのでMIDI音源で自分でMIDIメッセージを作成（`sdMidiSetMes`）・送信（`sdMidiSendMes`）した場合には影響しません．ワンショット・PCMストリーム音源は再生ピッチを設定するAPIである`sd????SetPitch`の影響を受けます（ピッチが上下します）

#### `sdShotSetSetFxCh`，`sdPstmSetSetFxCh`

音源からのデジタルオーディオをDSPに入力する時の入力端子番号を指定します．同時にDSPへのセンドレベル（ベースセンドレベル）も指定します．センドレベルは`sd????SetFxLev`の影響を受けます．`sd????SetVol`の値によっては（負数指定）DSPの入力に入る以前に音が無くなっている（無音状態）になっている可能性がありますので注意して下さい．

#### `sdMidiSetSetFxLev`，`sdShotSetSetFxLev`，`sdPstmSetSetFxLev`

音源からのデジタルオーディオをDSPに入力する時のセンドレベルを指定します．実際のセンドレベルは`sd????SetFxCh`のベースレベルの影響を受けます．`sd????SetVol`の値によっては（負数指定の場合元のサウンドデータとの兼ね合いによる）DSPの入力に入る以前に音が無くなっている（無音状態）になっている可能性があり，その場合FX音は鳴らないので注意して下さい．

#### `sdMidiSetSetDrctLev`，`sdShotSetSetDrctLev`，`sdPstmSetSetDrctLev`

音源からのデジタルオーディオをFXをかけずにしゅ通力する音声のレベルを設定します．．`sd????SetVol`の値によっては（負数指定の場合元のサウンドデータとの兼ね合いによる）ここの数値を上げても音が実際に鳴らないので注意してください．

### グローバルサウンドコントロールAPI

実際の引数などはリファレンスのグローバルサウンドモジュールAPIを参照下さい．

#### `sdSndSetFxPrg`

FXの設定をします．実際には必ずFXプログラムデータ番号とFXアウトプットデータ番号を同時に指定しなければなりません．
MIDI音源に関しては既に発音しているものに対しては効果が変化しませんので注意して下さい．

#### `sdSndSetFxOut`

FXアウトプットのみの設定を行います．FXアウトプットデータ番号を指定します．
MIDI音源に関しては既に発音しているものに対しては効果が変化しませんので注意して下さい．

#### `sdSndSetFxOutPrm`

FXアウトプットのパラメータの設定を行います．リアルタイムにFXのかかり具合を変化させたいときに利用します．
MIDI音源に関しては既に発音しているものに対しては効果が変化しませんので注意して下さい．

#### `sdSndSetMasterVol`

全ての音源をミックスした最終的なデジタルオーディオに対して出力レベルを設定します．このAPIの値が`0000H`になっているど音はまったく鳴らなくなるので注意して下さい．

## パラメータ設定上の注意

Dreamcast用のサウンドライブラリは基本的にサウンドクリエイタの設定したパラメータを尊重するためにAPIで設定するパラメータのほとんどはサウンドデータからの相対値になっています．つまり，パンポットの設定で`0000H`と設定したからパンポットは中央にあるとは限りません．