#include "sgl.h"
Uint8 *sddrvaddr;
Uint32 drvsize;
Uint8 *map;
Uint32 mapsize;
void slInitSound( sddrv, drvsize, map, mapsize );
Uint8 *sddrvaddr - サウンドドライバのアドレス
Uint32 drvsize - サウンドドライバのサイズ
Uint8 *map - サウンドエリアマップのアドレス
Uint32 mapsize - サウンドエリアマップのサイズ
void - 何も返しません。
サウンドドライバーのセットと、サウンドコントロールCPU(MC68000)の
初期化を行います。
サウンドドライバは バージョン2.00 以降に対応していますので、
それ以前のサウンドドライバでは実行できません。
extern Uint8 *sddrvs;
extern Uint32 sddrvsize;
Uint8 map[ 256 ];
Uint32 mapsz = 256;
slInitSound( sddrvs, sddrvszize, map, mzpsz );
全てのサウンド関数を実行する前に必ず実行してください。
slInitSystem関数では、サウンドに関する初期化を一切行ないません。
#include "sgl.h"
void *addr;
void slWaitSound( addr );
void *addr - 監視したいアドレス。
void - 何も返しません。
指定されたアドレスのデータが0になるまで待ちます。
サウンドドライバが、ファンクションを実行したことを表します。
slWaitSound( slSndMapChange( 2 ) );
slSndMapChange |
slSoundRequest |
#include "sgl.h"
Uint8 Lvol;
Uint8 Rvol;
Uint8 Lpan;
Uint8 RPan;
Bool slCDDAOn( Lvol, Rvol, Lpan, Rpan );
Uint8 Lvol - 左方向の音量
Uint8 Rvol - 右方向の音量
Uint8 Lpan - 左方向のパン
Uint8 RPan - 右方向のパン
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
CDDAを使用する際の、音量、方向を指定します。
音量は 0(Off)から127(下位4ビットは無効)、パンは(左 -127〜0〜+127 右)
(ただし、下位3ビットは無効)で指定します。
成功すればTRUEを、失敗すればFALSEを返値として返します。
slCDDAOn( 127, 127, 0, 0 );
slCDDAOff |
slSndFlush |
#include "sgl.h"
Bool slCDDAOff( void );
void - 何も与えません。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
CDDAの再生を中止します。
成功すればTRUEを、失敗すればFALSEを返値として返します。
slCDDAOff();
slCDDAOn |
slSndFlush |
#include "sgl.h"
PCM *pcm;
void *data;
Uint32 size;
Sint8 slPCMOn( pcm, data, size );
PCM *pcm - PCMデータ管理構造体
void *data - PCMデータの実体
Uint32 size - PCMデータのサイズ
Sint8 - PCMチャネルの番号又は、エラーコード。
PCM音源による音楽(効果音)の再生を行います。
data は 再生用のPCMデータテーブルで、ステレオの場合には下の図の様に
右チャンネル用と左チャンネル用とを前半と後半とに分けてセットしておいて
ください。通常のPCMデータはLチャネルとRチャネルが交互に来ており、下の
図のように分離されていません。
+---------------+
| |
| Rデータ |
| (frame * datasize byte)
+---------------+
| |
| Lデータ |
| |
+---------------+
PCM型のデータは以下のような形式の構造体です。
typedef struct {
Uint8 mode; /* 再生モード */
Uint8 channel; /* 再生チャンネル */
Uint8 level; /* 再生レベル */
Sint8 pan; /* 再生パン */
Uint16 pitch; /* 再生ピッチ */
Uint8 eflevelR; /* エフェクトレベル(右及び、モノラル用) */
Uint8 efselectR; /* エフェクト番号(右及び、モノラル用) */
Uint8 eflevelL; /* エフェクトレベル(左用) */
Uint8 efselectL; /* エフェクト番号(左用) */
} PCM;
再生モードは以下のものをセットします。
<_Stereo または _Mono> 及び、<_PCM16Bit は _PCM8Bit
再生チャンネルは slPCMOn 関数がセットします(通常終了時の戻り値)。
再生レベルは 0〜127(下位4ビットは無効) 、
再生パンは (左 -127〜0〜+127 右) (下位8ビットは無効) をセットします。
再生ピッチは16ビットで、44.1kHzに対するレートを指定します。
エフェクトレベルは 0〜7、エフェクト番号は0〜15を指定してください。
関数の戻り値は通常終了の場合0〜7、コマンドバッファが足りない場合-1、
PCMのチャンネルが空いていない場合-2、PCM用のバッファが足りない場合
-3を返します。
この関数で開始されたPCM再生はデータ終了をもって停止します。
slPCMOn( pcm , dat, datsize );
PCMの再生データをサウンドRAMに転送する場合。通常SCU-DMAのレベル2が
使用され、V-Blank In時に転送されます。ところが、WorkRAM LowはSCUの制御外
ですのでその場合には、CPU-DMAを使って転送します。そのため、再生データが
WorkRAM-L の領域にある場合、以下のような制約があります。
・再生データは偶数アドレスから配置されているものとして扱います。
(アドレスの下位1ビットを0にして使用します)
従って必ず再生データは、偶数アドレスに配置してください。
・再生データがステレオで、8ビットの場合、左チャンネルのデータも偶数アドレス
から配置されているものとします。
このことは、ステレオデータを再生する場合、サンプル数を偶数にする必要が
あるという事を意味しています。
・再生データが8192フレーム以上の場合に、バッファをラッピングする際に
ノイズが出ることがあります。
ですので8192フレームごとにデータを1バイト重複させて定義してください。
ただし、先頭は1536(600H)フレームオフセットされたところから始まります。
したがって、重複させる最初のデータは6656(1A00H)のデータとなります。
PCM構造体は、SGL Ver. 3.20以降とそれ以前のSGLとでは構造が異なります。
もし、古いバージョンのSGL用に作られたPCMデータは、PCM構造体の最後のメンバ
を追加する必要があります。ご注意ください。
slPCMOff |
slPCMParmChange |
slPCMStat |
slSndPCMNum |
slSndFlush |
DMASt_CPU0 |
DMASt_SCU0 |
#include "sgl.h"
PCM *pcm;
Bool slPCMOff( pcm );
PCM *pcm - 今鳴っているPCMデータの管理構造体。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
指定されたチャンネルのPCM再生を中止します。
成功すればTRUEを、失敗すればFALSEを返値として返します。
slPCMOff( pcm );
slPCMOn |
slPCMParmChange |
slPCMStat |
slSndPCMNum |
slSndFlush |
#include "sgl.h"
PCM *pcm;
Bool slPCMParmChange( pcm );
PCM *pcm - 変更したいPCMデータの管理構造体。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
PCM再生用の各パラメータの変更をします。
成功すればTRUEを、失敗すればFALSEを返値として返します。
extern PCM pcm;
pcm.pitch += 100;
slPCMParmChange( pcm );
slPCMOn |
slPCMOff |
slPCMStat |
slSndPCMNum |
slSndFlush |
#include "sgl.h"
PCM *pcm;
Bool slPCMStat( pcm );
PCM *pcm - 調査したいPCMデータの管理構造体。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
指定されたチェンネルのPCMが再生中であるか調べ、フラグを返します。
再生中であればTRUE、終了していればFALSEが返ります。
if ( slPCMStat( pcm ) == TRUE) {
/* 再生中 */
} else {
/* 再生終了 */
}
slPCMOn |
slPCMOff |
slPCMParmChange |
slSndPCMNum |
slSndFlush |
#include "sgl.h"
Uint8 mode;
Sint8 slSndPCMNum( mode );
Uint8 mode - モード(ステレオかモノラルか)(後述)
Sint8 - 空いているPCMチャネルの番号。
空いているPCMチャンネル番号を返します。
空きがない場合には-1が、正常終了した場合には0〜7が返されます。
mode には _Stereo または _Mono を指定します。
PCMは最大8音まで鳴らすことができますが、ステレオ再生を行う場合、
2音分必要になりますので、4つしか鳴らしていなくても、8音になっている
ことがありますので注意してください。
if ( slSndPCMNum( _Stereo ) != -1 ) {
slPCMOn( ... )
}
slPCMOn |
slPCMOff |
slPCMParmChange |
slPCMStat |
DMASt_CPU0 |
DMASt_SCU0 |
#include "sgl.h"
Uint8 effect;
Bool slSndEffect( effect );
Uint8 efct - エフェクト番号。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
DSPによるサウンドエフェクトを切り替えます。
成功すればTRUEを、失敗すればFALSEを返値として返します。
エフェクトが何も出力されないミキサを0、もともとのミキサを1とすると、
slSndMixParmChange( 0, 127, 0 );
slSndEffect( 1 );
for ( i = 0 ; i < 60 ; ++i ) slSynch();
slSndMixParmChange( 1, 127, 0 );
これは、エフェクトチェンジの際にノイズの発生を抑えるやり方の一例です。
エフェクトチェンジする時エフェクトの種類によってはかなりのノイズが発生
する場合があります。
これを抑える方法として、まず予め、エフェクトが一切出力されないような
ミキサを作っておき、エフェクトチェンジする前に、
slSndMixParmChange関数で、そのエフェクトに切替えておきます。
その後、slSndEffectを実行し、エフェクトを切り替え、その後音が
安定するまで、1秒程度ウエイトをおきます。その後再び、
slSndMixParmChange関数を使って元のミキサに戻します。
ただし、最初に、エフェクトの出力しないミキサに切替える時にわずかにノイズが
のる可能性もあります。その場合、slSndVolume関数で、トータルボリューム
を下げることで誤魔化す事が出来ますが、この場合全ての音源に影響を
あたえるので注意が必要です。
slSndMixParmChange |
slSndVolume |
slSndFlush |
#include "sgl.h"
Uint8 mix;
Uint8 vol;
Sint8 pan;
Bool slSndMixParmChange( mix, vol, pan );
Uint8 mix - ミキサー番号
Uint8 vol - 音量
Sint8 pan - パン
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
ミキサのパラメータを変更します。
vol は0〜127(下位4ビットは無効)、panは、(左 -128〜0〜+127 右)
(下位3ビットは無効) をセットします。
成功すれば、TRUEを、失敗すればFALSEを返値として返します。
slSndMixParmChange( 1, 127, 0 );
slSndFlush |
#include "sgl.h"
const char *form;
/* arg1, arg2, ... */
Sint8 slSoundRequest( form[], ...);
const char *form - 次の引数のフォーマット
arg1, arg2, ... - パラメータ
Sint8 - 関数の実行状態(ステータス)
サウンドドライバに直接渡すデータをセットします。
form には これに続くデータの個々のサイズを文字列データで表します。
ただし、先頭のデータはファンクションコードとし、文字列には含みません。
戻り値は フォーム文字列に不当な文字があった場合、-2、
ワードデータを奇数アドレスからセットしようとした場合、-1を返します。
正常終了した場合0を返します。
Uint16 Lev;
Uint8 *data;
Uint16 StreamBuf;
Uint16 StreamSize;
Uint16 Pitch;
StreamBuf = ( Uint16 )( data >> 4 );
Lev = 7; /* Set Volume to max */
slSoundRequest( "bbwwwbb", SND_PCM_START, _Stereo | _PCM16Bit, Lev << 5 | 0,
StreamBuf, StreamSize, Pitch, 0, 0 );
この場合、SND_PCM_START がファンクションコードとなり、文字列には
含まれません。
_Stereo | _PCM16Bit, Lev << 5 | 0 はそれぞれバイトデータ、
StreamBuf >> 4, StreamSize, Pitchはそれぞれワードデータとして
サウンドドライバに渡されます。
slSndFlush |
#include "sgl.h"
Bool slDSPOff( void );
void - 何も与えません。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
DSPを初期化(停止)します。
成功すればパラメータをセットしたコマンドバッファのアドレスを、失敗すれば
FALSEを返値として返します。
slDSPOff();
slSndFlush |
SoundRdCount |
#include "sgl.h"
Uint8 vol;
Bool slSndVolume( vol );
Uint8 vol - サウンド全体の音量。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
サウンド出力全体の音量をセットします。
volは0から127(ただし、下位4ビットは無効)を指定します。
また、0の場合、音は出力されません。
音量の変更に成功すればTRUEを、失敗すればFALSEを返値として返します。
slSndVolume( 10 << 3 );
#include "sgl.h"
Bool slSoundAllOff( void );
void - 何も与えません。
Bool - コマンドの発行が正しく行なわれたかを示すフラグ。
すべてのサウンドシーケンスを停止します。
成功すればTRUEを、失敗すればFALSEを返値として返します。
slSoundAllOff();
この関数を実行するとサウンドコマンドバッファにあった未処理のサウンド
処理は全て取り消されます。
また、実行はslSynchを待たずに即座に行なわれます。
slSoundAllPause |
slSoundAllCont |
slSndFlush |
SoundRdCount |
#include "sgl.h"
void slSoundAllPause( void );
void - 何も与えません。
void - 何も返しません。
演奏中の全シーケンス(BGM含む)を一時停止します。(ただし、PCMストリームは
止まりません)
slSoundAllPause();
slSoundAllCont |
slSoundAllOff |
slSndFlush |
SoundRdCount |
#include "sgl.h"
void slSoundAllCont( void );
void - 何も与えません。
void - 何も返しません。
一時停止中の全シーケンス(BGM含む)を再開します。
slSoundAllCont();
slSoundAllPause |
slSoundAllOff |
slSndFlush |
SoundRdCount |
#include "sgl.h"
void slSndFlush( void );
void - 何も与えません。
void - 何も返しません。
サウンドコントロールバッファに残っているコントロールコマンドをサウンド
ドライバに出力します。
通常、サウンドコントロールコマンドはシステムが用意したバッファにセット
されており、バッファがいっぱいになるか、あるいは、slSynch()関数が実行
された時にサウンドドライバに対し、出力されます。
ただし、以下の関数においてはバッファは直ちに出力されます。
slSndMapChange()
slDSPOff()
slPCMOff()
slSoundRequest()
slSoundAllPause()
slSoundAllCont()
また、以下の関数を実行した場合、バッファ内のコマンドは破棄されます。
slSoundAllOff()
slSndFlush();