English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る|  ■
PROGRAMMER'S TUTORIAL

14.サウンドライブラリ


 本章では、サウンドコントロールライブラリを使って、セガサターンでサウンドを出力する際の手順と注意点について説明します。

14-1. サウンドコントロールの概要

 セガサターンではサウンドコントロール用CPUとしてMC68000を登載し、マスターCPUとは独立して動作できるようになっています。
マスターCPUとサウンドCPUとは、コマンドバッファと呼ばれるRAMを通してファンクションのやり取りをします。ファンクションの発行はサウンドコントロールライブラリが行いますので、 ユーザーはCPU間のやり取りを意識することなくサウンドをコントロールすることができます。
セガサターンで使用できる音源には、PCMとCDとがありますが、サウンドドライバーはこのうちのPCM音源に対するコントロールを行います。

図14-1 サウンドドライバーシステム構成
┏━━━━━━┓  ┏━━━━━━┓  ┏━━━━━━┓     
┃サウンド  ┃  ┃      ┃  ┃      ┃     
┃ライブラリ ┃←→┃ マスター ┃←→┃ スレーブ ┃     
┠──────┨  ┃ CPU  ┃  ┃ CPU  ┃     
┃      ┃  ┃      ┃  ┃      ┃     
┃      ┃  ┗━━━━━━┛  ┗━━━━━━┛     
┃      ┃      ↑                  
┃      ┃      ↓                  
┃      ┃  ┏━━━━━━┓               
┃      ┃  ┃ サウンド ┃               
┃      ┃  ┃ ドライバ ┃  ┏━━━━━━━━┓   
┃      ┃  ┠──────┨  ┃サウンドCPU ┃   
┗━━━━━━┛  ┃ コマンド ┃←→┃MC68000 ┃   
          ┃ バッファ ┃  ┃        ┃   
          ┃      ┃  ┗━━━━━━━━┛   
          ┠──────┨      ↓        
          ┃      ┃   ┏━━━━━┓     
          ┃ サウンド ┃   ┃PCM音源┃→スピーカ
          ┃ データ  ┃   ┗━━━━━┛     
          ┗━━━━━━┛               
            共有RAM                
                                 

14-2. サウンドドライバーの設定

 サウンドドライバーを用いてセガサターンでサウンドを制御するには、次の操作手順で行います。

図14-2 サウンドの制御手順
┏━━━━━━━━━━━━━━┓
┃ サウンドドライバのセット  ┃
┃ とMC68000の起動  ┃
┗━━━━━━━━━━━━━━┛
       ↓        
┏━━━━━━━━━━━━━━┓
┃ サウンドデータのセット  ┃
┗━━━━━━━━━━━━━━┛
       ↓        
┏━━━━━━━━━━━━━━┓
┃  BGM演奏/効果音、  ┃
┃  PCM音源の制御    ┃
┗━━━━━━━━━━━━━━┛
                

サウンドドライバーのセットとMC68000の起動

 サウンドを使用するためにはまず、サウンド制御用のMC68000を起動しなければなりません。また、このMC68000上で動作するドライバープログラムも必要です。これらはライブラリ関数“slInitSound()”を実行することによりセットできます。

【void slInitSound(void *drv , Uint32 drvsz , void *map , Uint32 mapsz) ;】
 サウンドドライバーのセットとサウンドCPU(MC68000)の初期化を実行します。“drv”は MC68000上で動作するサウンドドライバープログラムで、MC68000の0番地からロードされます。“drvsz”はこのドライバープログラムの大きさです。
通常は、
slInitSound(drv , sizeof(drv) , maptbl , sizeof(maptbl)) ;
のように使用します。

 この関数“slInitSound()”では、以下に示す手順が実行されます。

  1. MC68000のリセット
  2. MC68000のメモリ領域 0xB000までの0クリア
  3. ドライバープログラムの転送 (0番地からサイズ分)
  4. マップデータの転送 (0xA000番地からサイズ分)
  5. PCM再生用のメモリ領域の登録
  6. MC68000のスタート
  7. マップデータの登録

サウンドデータのセット

 上記の“slInitSound()”を実行しただけでは、まだ演奏用のデータがセットされていませんので、これをセットします。演奏用のデータは、MC68000のメモリ領域の0xB000(プログラム上では0x25A0B000)以降に格納します(マップデータにより異 なる場合がありますのでサウンドデザイナーの方に問い合わせてください)。次の関数を使って転送します。

図14-3 サウンドデータのセット例
┌                                                             ┐
│slDMACopy(sounddat , (void *)0x25a0b000 , sizeof(sounddat)) ;│
│slDMAWait() ;                                                │
└                                                             ┘

 これで、演奏の準備ができました。

BGMの演奏

 音楽(および効果音)はシーケンスという単位で扱われます。シーケンスとは、一連の音の組み合わせ(流れ)を始めから終わりまで演奏することであり(これが曲であったり、ワンショットの効果音であったりします)、セガサターンのサウンドドライバーでは、これ を同時に8つまで演奏することができます。SGLでは、この8つのシーケンスの内、0番をBGM用に割り振っています。BGMを鳴らす場合は、“slBGMOn()”関数を実行します。

【Bool slBGMOn(Uint16 Song , Uint8 Prio , Uint8 Volume , Uint8 Rate) ;】
 BGM演奏を開始させます。

Song  : 曲(効果音)番号
Prio  : 音源を使用する際の優先順位
Volume: 音量
Rate  : Volumeに達するまでの時間

 プライオリティ“Prio”は音源を使用する際の優先順位と呼ばれるもので、32チャンネルある音源を複数のシーケンスが共有して音を出すため、それぞれで使用するチャンネル数の 合計が32を超えた場合に優先度の低い音から削除してチャンネルを確保するためのものです。

 音量“volume”は 0〜127 が選べ、数値が大きいほど音量も大きくなります。レート“Rate”とは指定された音量に達するまでの時間で、0〜255が指定できます。0の場合は即座にその音量となり、 1〜255の場合は音量0から指定音量までフェードインするようになります。

 BGMは、以下の関数によってテンポや音量を変更したり、演奏を停止、一時停止、再開したりすることができます。

slBGMTempo(Sint16 Tempo) ; /* テンポの変更 */
slBGMFade(Uint8 Volume , Uint8 Rate) ; /* 音量の変更 */
slBGMOff() ; /* 演奏の停止 */
slBGMPause() ; /* 演奏の一時停止 */
slBGMCont() ; /* 演奏の再開 */
slBGMStat() ; /* 演奏中であるか調べる */

効果音の出力

 効果音も上記のBGM同様、シーケンスとして管理されています。 効果音を出力するには、関数“slSequenceOn()”を実行します。

【Uint8 slSequenceOn(Uint16 Song , Uint8 Prio , Uint8 Volume , Uint8 Pan) ;】
Song  : 曲(効果音)番号
Prio  : 音源を使用する際の優先順位
Volume: 音量
Pan   : 左右の音量の振り分け

 パラメータはBGM用の関数に似ていますが、Panというパラメータが異なっています。これは、左右の音量をどのように振り分けるかを示すもので、どの方向から音が聞こえるかということに使えます。 Panには −128〜+127の値が指定でき、−128が左、0が正面、+127が右を表します。

 パラメータPanの代入値:
Left : -128 << 0 >> +127 : Right

 3Dのシューティングゲームの爆発などで、距離や方向によってVolumeやPanを設定すると臨場感が増すはずです。

 この関数“slSequenceOn()”は、指定された効果音が何番の発音管理番号で出力されているかを返します。この発音管理番号は、出力している効果音に対して、以下の関数を使って変更を行う際に使用されます。

slSequenceTempo(Uint8 Seqnm , Sint16 Tempo) ; /* テンポを変更 */

slSequenceFade(Uint8 Seqnm , Uint8 Volume , Uint8 Rate) ; /* 音量を変更 */

slSequencePan(Uint8 Seqnm , Uint8 Pan) ; /* 発生方向を変更 */

slSequenceOff(Uint8 Seqnm) ; /* シーケンスを停止する */

slSequencePause(Uint8 Seqnm) ; /* シーケンスを一時停止する */

slSequenceCont(Uint8 Seqnm) ; /* 一時停止中のシーケンスを再開する */

slSequenceStat(Uint8 Seqnm) ; /* シーケンスが演奏中であるかを調べる */

PCM音源を使用した効果音の出力

 音声や爆発音などのサンプリングした効果音を出力する場合は、PCM音源を使用することができます。PCMストリームによる効果音再生は上記のシーケンスとは別に、最大4チャンネルまで同時に出力することができます。 PCMストリームを使用する場合には関数“slPCMOn()”実行します。

【Sint8 slPCMOn(PCM *pdat , void *data , Uint32 size) ;】
PCM音源による演奏を開始します。
pdat : PCMストリームの再生モード等のPCM型構造体データ
data : PCMストリームの音源データ
size : PCMストリームデータのサイズ

PCM型構造体データは以下のような構成で、PCMストリームの再生パラメータを指定するために使用されます。

図14-4 PCM型構造体データ


typedef struct{
	Uint8	mode;		/* Mode */
	Uint8	channel;	/* PCM Channel Number */
	Uint8	level;		/* 0 ‾ 127 */
	Sint8	pan;		/* -128 ‾ +127 */
	Uint16	pitch;
	Uint8	eflevelR;	/* Effect level for Right(nomo) 0 ‾ 7 */
	Uint8	efselectR;	/* Effect select for Right(mono) 0 ‾ 15 */
	Uint8	eflevelL;	/* Effect level for Left(mono) 0 ‾ 7 */
	Uint8	efselectL;	/* Effect select for Left(mono) 0 ‾ 15 */
	}PCM;

	mode		:_Stereo or _Mono、_PCM16Bit or _PCM8Bitを指定します
	channel		:PCM再生チャンネル(この関数がセットします)
	level		:音量
	pan		:音量の左右の振り分け
	pitch		:再生レート(音程が変化します)
	eflevelR	:エフェクトをかける度合(右チャンネル用)
	efselectR	:エフェクトナンバー(右チャンネル用)
	eflevelL	:エフェクトをかける度合(左チャンネル用)
	efselectL	:エフェクトナンバー(左チャンネル用)

 PCMストリームは上述のシーケンスと異なり、マスターCPUがサウンド用SCSP LSIの使用するデータをセットしながら再生を行なうため、マスターCPUの負荷が増えることになります。 サウンドデザイナーの方と相談して、上述のシーケンスでサウンド出力するかPCMストリームを使用するかを決めてください。この関数“slPCMOn()”は、指定されたPCMストリームが、何番の管理番号で出力されているかを返します。 この関数以外に、PCMストリームによる効果音再生に使用する関数を次に示します。

slPCMOff(PCM *pdat) ; /*演奏を停止する*/
slPCMParmChange(PCM *pdat) ; /*パラメータを変更する*/
slPCMStat(PCM *pdat) ;/*指定したPCMチャンネルが演奏中であるかを調べる*/

サウンド出力全体に影響する関数

 上述の関数は個々のサウンド出力に対するものでしたが、以下の関数はサウンド出力全体に影響します。

slSndVolume(Uint8 Volume) ; /* 全体音量 */
slSoundAllOff() ; /* 全サウンドシーケンスの停止 */
slDSPOff() ; /* 効果用DSPの停止 */
slSndMixChange(Uint8 Tbank , Uint8 Mixno) ; /* ミキサーの切替え */
slSndMixParmChange(Uint8 Effect , Uint8 Level , Uint8 Pan) ;
              /* ミキサーのパラメータ変更 */

14-3. メモリマップ

サウンドCPUのメモリマップは大まかに以下のようになっています。PCMストリームを使用しない場合には、PCM再生バッファは必要ありませんので、シーケンスデータに使用することができます。

図14-5 サウンドCPUのメモリマップ
25A00000┏━━━━━━━━━━━━┓
        ┃            ┃
        ┃     例外ベクタ等   ┃
        ┃            ┃
25A00500┣━━━━━━━━━━━━┫
        ┃            ┃
        ┃ カレントマップデータ ┃
        ┃            ┃
25A00700┣━━━━━━━━━━━━┫
        ┃            ┃
        ┃  コマンドバッファ  ┃
        ┃            ┃
25A00800┣━━━━━━━━━━━━┫
        ┃            ┃
        ┃ サウンドドライバー  ┃
        ┃            ┃
25A0A000┣━━━━━━━━━━━━┫
        ┃            ┃
        ┃   マップデータ   ┃
        ┃            ┃
25A0B000┣━━━━━━━━━━━━┫
        ┃            ┃
        ┃  音色、シーケンス  ┃
        ┃            ┃
25A78000┣━━━━━━━━━━━━┫
        ┃            ┃
        ┃ PCM再生バッファ  ┃
        ┃            ┃
25A7FFFF┗━━━━━━━━━━━━┛

14-4. サンプルプログラム

BGMと効果音の再生テスト用サンプルプログラム

 次のサンプルプログラムは、BGMと効果音の再生テストのために作成されたものです。 本サンプルで使用しているデータファイルは以下のような構成になっています。

図14-6 サンプルプログラムのデータファイル

バンク ソング    内 容 ------ ------ -------  0   0   曲(ループ無し)      1   曲(ループあり)  1   0   パシッ(C3)      1   パシッ(D3)      2   パシッ(E3)      3   パシッ(F3)      4   パシッ(G3)      5   パシッ(A3)      6   パシッ(B3)      7   パシッ(C4)  2   0   イェー  3   0   長いバイオリンの音      1   短いバイオリンの音(ループ)

 バンクおよびソングで指定した曲を、XボタンでBGMとして再生し、Aボタンで効果音として再生します。 バンク、ソングの指定は、スタートキーと十時キーで行います。 Yボタン、Bボタンが、それぞれBGMと効果音に対するポーズオン・オフとなっており、Zボタン、Cボタンが、フェードイン・アウトとなっています。 効果音のシーケンスナンバーの指定は、十時キーの左右で、全体のボリューム設定は十時キーの上下で行えます。

リスト14-1 sampsnd1:BGMと効果音の再生テスト

main.c

フロー14-1 sampsnd1:BGMと効果音の再生テスト

PCM音源再生テスト用サンプルプログラム

 次のサンプルプログラムは、PCM音源再生のテストのために作成されたものです。
PCM音源のサンプルデータは、16ビットステレオ、8ビットステレオ、16ビットモノラルの3種類が用意されており、それぞれ、Xボタン、Yボタン、Zボタンの入力によって再生されます。

リスト14-2 sampsnd2:PCM音源再生テスト

main.c

フロー14-2 sampsnd2:PCM音源再生テスト

付記 本章に登場したサウンドライブラリ関数

 本章では、次表の関数を解説しました。

表14-1 本章に登場したサウンドライブラリ関数
関数型
   関 数 名   
     パ ラ メ ー タ    
         機   能         
voidslInitSoundvoid *drv,Uint32 drvsz,void *map,Uint32 mapszサウンドドライバーのセットとサウンドコントロールCPUの初期化
BoolslBGMOnUint16 Song,Uint8 Prio,Uint8 Volume,Uint8 RateBGM演奏の開始
BoolslBGMTempoSint16 TempoBGM演奏速度の変更
BoolslBGMFadeUint8 Volume,Uint8 RateBGM演奏音量の変更
BoolslBGMOffvoidBGM演奏の停止
BoolslBGMPausevoidBGM演奏の一時停止
BoolslBGMContvoid一時停止中BGMの演奏再開
BoolslBGMStatvoidBGM再生中チェック
Uint8slSequenceOnUint16 Song,Uint8 Prio,Uint8 Volume,Uint8 Rate指定した効果音の発生開始
BoolslSequenceTempoUint8 Seqnm,Uint16 Tempo指定した効果音の速度変更
BoolslSequenceFadeUint8 Seqnm,Uint8 Volume,Uint8 Rate指定した効果音の音量変更
BoolslSequencePanUint8 Seqnm,Uint8 Pan指定した効果音の発生方向変更
BoolslSequenceOffUint8 Seqnm指定した効果音の発生停止
BoolslSequencePauseUint8 Seqnm指定した効果音の発生一時停止
BoolslSequenceContUint8 Seqnm一時停止中効果音の発生再開
BoolslSequenceStatUint8 Seqnm指定した効果音の再生中チェック
Sint8slPCMOnPCM *pdat,void *data,Uint32 sizePCM音源による演奏開始
BoolslPCMOffPCM *pdatPCM音源による演奏停止
BoolslPCMParmChangePCM *pdatPCM再生用パラメータの変更
BoolslPCMStatPCM *pdat指定したPCMチャンネルの再生中チェック
BoolslSndVolumeUint8 Volume全体の音量セット
BoolslSoundAllOffvoid全てのサウンドシーケンスの演奏停止
BoolslDSPOffvoidDSP演奏の停止
BoolslSndMixChangeUint8 Tbank,Uint8 Mixno音色バンクに対応するミキサの切替え
BoolslSndMixParmChangeUInt Effect,Uint8 Level,Uint8 Panミキサのパラメータ変更


戻る|  ■
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997