音利用関数
|
宣言 | int PlaySoundFile( char *FileName , int PlayType ) ;
|
概略 | 音ファイルを再生する
|
引数 |
FileName : 再生する音ファイル文字列へのポインタ
PlayType : 再生形式 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
FileNameで指定した音ファイルを鳴らします。
再生できる音ファイル形式は WAV, MP3, Ogg, Opus の4種類で、
再生のタイプには以下の3種類がありこの内のどれかを選びます。
DX_PLAYTYPE_NORMAL | : ノーマル再生 |
DX_PLAYTYPE_BACK | : バックグラウンド再生 |
DX_PLAYTYPE_LOOP | : ループ再生 |
ノーマル再生は音ファイルの再生が終るまで処理を止め、
バックグラウンド再生は鳴らし始めるとすぐ次の処理に移ります
(音を鳴らしながら何かをするときに使います)
ループ再生はバックグラウンド再生+ループ再生で、音楽の再生が終るとすぐ最初から再生が始まります。
|
|
サンプル
test.wavをノーマル再生します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのノーマル再生
PlaySoundFile( "test.wav" , DX_PLAYTYPE_NORMAL ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int CheckSoundFile( void ) ;
|
概略 | 音ファイルが再生中か調べる
|
引数 | なし |
戻り値 |
0:なっていない
1:鳴っている
-1:エラー発生
|
解説 |
PlaySoundFile 関数で鳴らした(ている)音が鳴り終わっているか調べます。
1の場合はまだ鳴っていて、0の場合は再生は終っています。
|
|
サンプル
test.wavをバックグラウンド再生し、なり終わるまで待つ
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのバックグラウンド再生
PlaySoundFile( "test.wav" , DX_PLAYTYPE_BACK ) ;
// なり終わるまでここでループ
while( CheckSoundFile() == 1 )
{
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int StopSoundFile( void ) ;
|
概略 | 音ファイルの再生を止める
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
PlaySoundFile関数 での再生を停止します。
|
|
サンプル
test.wavをループ再生し、5秒経ったら止めます
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのループ再生
PlaySoundFile( "test.wav" , DX_PLAYTYPE_LOOP ) ;
// 5秒待つ『WaitTimer』使用
WaitTimer( 5000 ) ;
// 再生を止めます
StopSoundFile() ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int LoadSoundMem( char *FileName ) ;
|
概略 | 音ファイルをメモリに読みこむ
|
引数 |
FileName : メモリに読みこむ音ファイルのファイル名
文字列のポインタ |
戻り値 | -1:エラー |
| -1以外:サウンドハンドル
|
解説 |
音を再生する際PlaySound関数を使用すると同時に1つの音しか鳴らすことが出来ません。
それにPlaySoundFile関数は再生の際にそのつどディスク等からファイルを読みこむのでゲームなどの高速な連続再生などには向いていません。
ので何度も再生するような音はディスクから読みこんで取っておきいつでもすぐに再生できる状態にして置く必要があります。
そのための関数が LoadSoundMem関数 です。
この関数で戻り値として返ってくるサウンドハンドルとは読みこんだ音の識別番号です(int型の値です)。
音を再生する際にこの関数で得た識別番号を指定してやることで読みこんだ音を再生することが出来ます。
(メモリに読みこんだ音の再生には『PlaySoundMem』を使います)
例 test.wavをメモリに読みこんでサウンドハンドルを int型変数
SHandleに保存します
int SHandle ;
SHandle = LoadSoundMem( "test.wav" ) ;
ループ再生範囲を指定するテキストファイルの自動読み込みについて
DXライブラリでは LoadSoundMem で読み込みを指定されたサウンドファイル名の末端が『_loop.txt』となっているテキストファイルがあった場合、
そのテキストファイルの中の『LOOPSTART=ループ開始位置(サンプル単位)』と『LOOPLENGTH=ループ範囲の長さ(サンプル単位)』の二つのパラメータをサウンドファイルのループ再生の範囲として読み込みます。
この機能を使用すると前奏として一度だけ再生される部分と、ループして何度も再生される部分が一緒になっているBGM用のサウンドファイルのループ範囲を指定することができます。
例
bgm.wav と、ループ範囲情報の bgm_loop.txt を用意してループ範囲指定付きで
サウンドファイルを読み込みます
bgm_loop.txt の中身( 441000サンプル( 44.1KHzのPCMサウンドでは10秒 )から
1764000サンプル( 44.1KHzのPCMサウンドでは40秒 )分の間をループ再生する )
( ※注意※ 内容は全て半角文字で入力されている必要があります )
LOOPSTART=441000
LOOPLENGTH=1764000
プログラムでは普通に bgm.wav を読み込むだけで、bgm_loop.txt が自動的に読み込まれます。
int SoundHandle ;
SoundHandle = LoadSoundMem( "bgm.wav" ) ;
OGGファイルの LOOPSTART と LOOPLENGTH コメントについて
DXライブラリは某有名RPG製作ツールと同じく OGGファイルのコメントに LOOPSTART と LOOPLENGTH
という名前のサウンドのループ範囲情報が含まれていた場合は自動的にその情報を読み取り、
PlaySoundMem で再生した際は指定の範囲がループ再生されます。
なので OGGファイルを使用する場合は前述の _loop.txt を使ったループ範囲指定の他に、
OGGファイル自体にループ範囲の情報を埋め込むという選択肢があります。( OGGファイルのコメントの編集はサウンド編集ソフトを使用します )
|
|
サンプル
test.wavをメモリに読み込みそのサウンドハンドルを int型変数 Shandle
に保存しその後再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 読みこんだ音をノーマル再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_NORMAL ) ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int PlaySoundMem( int SoundHandle , int PlayType , int TopPositionFlag ) ;
|
概略 | メモリに読みこんだ音データを再生する
|
引数 |
SoundHanle : 再生する音の識別番号(サウンドハンドル)
PlayType : 再生形式
DX_PLAYTYPE_NORMAL : ノーマル再生
DX_PLAYTYPE_BACK : バックグラウンド再生
DX_PLAYTYPE_LOOP : ループ再生
TopPositionFlag : 再生位置を音データの先頭に移動するかどうか
( TRUE:移動する(デフォルト) FALSE:移動しない ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadSoundMem関数 でメモリに読みこんだ音を読み込み時に取得した
サウンドハンドルで再生します。
PlaySoundFile関数との違いは、再生にサウンドハンドルを使用するということと、第三の引数
TopPositionFlag があることです。
TopPositionFlag は音データを再生する前に再生開始位置を先頭に戻すかどうかを指定します。
TRUE を渡すと先頭から再生され、FALSE を渡すと最後に StopSoundMem をした位置か、
SetSoundCurrentTime で指定した位置から再生されます。
尚、TopPositionFlag は省略可能で、省略した場合は TRUE を指定したことになります。
再生にサウンドハンドルを使用する、TopPositionFlag がある、ということ以外はPlaySoundFile関数
と違いはありません。(再生形式の詳しい説明は『PlaySoundFile』を
参照してください。)
|
|
サンプル
上記『LoadSoundMem』関数を参照してください
|
宣言 | int CheckSoundMem( int SoundHandle ) ;
|
概略 | メモリに読みこんだ音データが再生中か調べる
|
引数 | SoundHandle : 再生状態を調べる音の識別番号(サウンドハンドル) |
戻り値 | 1:再生中 |
| 0:再生されていない -1:エラー発生
|
解説 |
PlaySoundMem関数で再生した SoundHandle が示す音が再生中かどうかを調べます。
調べる形式がサウンドハンドルを通して調べるということ以外CheckSound関数と違いはありません。
|
|
サンプル
test.wavをメモリに読み込みバックグラウンド再生し、なり終わるまで待つ
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 読みこんだ音をバックグラウンド再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_BACK ) ;
// なり終わるまでここでループ
while( CheckSoundMem( SHandle ) == 1 )
{
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
}
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int StopSoundMem( int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの再生を止める
|
引数 | SoundHandle : 再生を止める音の識別番号(サウンドハンドル) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
PlaySoundMem関数で再生中の SoundHandle が示す音を停止します。
停止の対象がサウンドハンドルを通して行われるという以外StopSound関数
と機能的な違いはありません。
|
|
サンプル
test.wavをループ再生し、5秒経ったら止めます
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 読みこんだ音をループ再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_LOOP ) ;
// 5秒待つ『WaitTimer』使用
WaitTimer( 5000 ) ;
// 再生を止めます
StopSoundMem( SHandle ) ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int DeleteSoundMem( int SoundHandle ) ;
|
概略 | メモリに読みこんだ音データを削除する
|
引数 | SoundHandle : 削除する音の識別番号(サウンドハンドル) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadSoundMem関数でメモリに読みこんだ音データをメモリから削除します。これにより貴重なメモリ資源を増やす事が出来ます。
削除したサウンドは再読み込みするまで使うことは出来なくなるのでいらなくなった音データを削除するのに使う関数です。
(音の再生中に削除した場合は再生を止めてから削除します)
|
|
サンプル
test.wavをループ再生し、5秒経ったら止め、その後そのサウンド
データを削除し終了します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 読みこんだ音をループ再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_LOOP ) ;
// 5秒待つ『WaitTimer』使用
WaitTimer( 5000 ) ;
// いらなくなったので音を削除します
DeleteSoundMem( SHandle ) ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int InitSoundMem( void ) ;
|
概略 | メモリに読みこんだ音データをすべて消去する
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadSoundMem関数でメモリに読みこんだすべての音データをメモリ上から削除します。これによってロードした音はすべて削除され初期化されます。
|
|
サンプル
test.wavを5回ロードし、0.1秒ごとに1回づつ再生した後音をすべて削除します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle[ 5 ] ;
int i ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
for( i = 0 ; i < 5 ; i ++ )
{
SHandle[ i ] = LoadSoundMem( "test.wav" ) ;
}
// 読みこんだ音を0.1秒おきにバックグラウンド再生します(『PlaySoundMem』関数使用)
for( i = 0 ; i < 10 ; i ++ )
{
// 音の再生
PlaySoundMem( SHandle[ i ] , DX_PLAYTYPE_BACK ) ;
// 0.5秒待つ(『WaitTimer』使用)
WaitTimer( 100 ) ;
}
// 音をすべて削除します
InitSoundMem() ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int ChangePanSoundMem( int PanPal , int SoundHandle ) ;
|
概略 | メモリに読みこんだ音データの再生にパンを設定する
|
引数 |
int PanPal : 左右の音量の比率
( -255 ~ 255 +は左の音量を下げ、-は右の音量を下げる)
int SoundHandle : パンを設定する音の識別番号(サウンドハンドル) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
音の再生にパンを設定します。パンとは簡単に説明しますと左右の音の音量の比率を変化させることです。
PanPal に-の値を設定すると右の音量が下がり、+の値を設定すると左の音量が下がります、
ただし残念ながら下がったぶん反対側の音量が上がることはありませんので正確な意味でのパンではありません。
標準ではパン値は0になっており、左右の音量はどちらも同じ比率になっています。
因みに音を再生中でもパンの変更は可能です。
|
|
サンプル
test.wavを読みこんで右のスピーカのみから音を出します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// パンの設定
ChangePanSoundMem( 255 , SHandle ) ;
// 音の再生
PlaySoundMem( SHandle , DX_PLAYTYPE_BACK ) ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int ChangeVolumeSoundMem( int VolumePal , int SoundHandle ) ;
|
概略 | メモリに読みこんだ音データの再生にボリュームを設定する
|
引数 |
int VolumePal : 設定する音量( 0 ~ 255 )
int SoundHandle : 音量を設定する音の識別番号(サウンドハンドル) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
再生する音の音量を設定します。0は無音、255で最大音量です。
音を再生中でも音量の変更は可能です。
|
|
サンプル
test.wavを読みこんで80%の音量で再生します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 音量の設定
ChangeVolumeSoundMem( 255 * 80 / 100, SHandle ) ;
// 音の再生
PlaySoundMem( SHandle , DX_PLAYTYPE_BACK ) ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int ChangeNextPlayPanSoundMem( int PanPal , int SoundHandle ) ;
|
概略 | メモリに読みこんだ音データの次の再生にのみ使用するパンを設定する
|
引数 |
int PanPal : 左右の音量の比率
( -255 ~ 255 +は左の音量を下げ、-は右の音量を下げる)
int SoundHandle : パンを設定する音の識別番号(サウンドハンドル) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
次に PlaySoundMem関数 で再生される音に適用するパンを設定します。
「既に再生している音のパンは変更したくないけど、これから再生する音のパンは変更したい」という場合に使用します。
尚、PanPal の意味については ChangePanSoundMem の解説を参照してください。
|
|
サンプル
test.wavを読みこんで左右のスピーカーから0.15秒毎に交互に音を鳴らします。
左右片方の音が鳴り止む前に次の音を鳴らしているので ChangePanSoundMem を使用した場合は
既に再生中の音にまでパン設定が反映されてしまいますが、ChangeNextPlayPanSoundMem では
次に再生する音のみ影響を与えるので、左右のスピーカーからそれぞれ独立して音が鳴ります。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
// DXライブラリの初期化
if( DxLib_Init() == -1 )
{
return -1 ;
}
// 音の読み込み
SoundHandle = LoadSoundMem( "Test.wav" ) ;
// 左右交互に音を鳴らす
while( ProcessMessage() == 0 )
{
// 左側のスピーカーから音を鳴らす
ChangeNextPlayPanSoundMem( -255, SoundHandle ) ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ;
// 0.15秒待つ
WaitTimer( 150 ) ;
// 右側のスピーカーから音を鳴らす
ChangeNextPlayPanSoundMem( 255, SoundHandle ) ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ;
// 0.15秒待つ
WaitTimer( 150 ) ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int ChangeNextPlayVolumeSoundMem( int VolumePal , int SoundHandle ) ;
|
概略 | メモリに読みこんだ音データの次の再生にのみ使用するボリュームを設定する
|
引数 |
int VolumePal : 次に再生する音に設定する音量( 0 ~ 255 )
int SoundHandle : 音量を設定する音の識別番号(サウンドハンドル) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
次に PlaySoundMem関数 で再生される音に適用する音量を設定します。
「既に再生している音の音量は変更したくないけど、これから再生する音の音量は変更したい」という場合に使用します。
尚、VolumePal の意味については ChangeVolumeSoundMem の解説を参照してください。
|
|
サンプル
test.wavを読みこんで[通常音量で音を再生する」と「小音量で音を再生する」を0.15秒毎に交互に行います。
一つ前に再生した音が鳴り止む前に次の音を鳴らしているので ChangeVolumeSoundMem を使用した場合は
既に再生中の音にまで音量設定が反映されてしまいますが、ChangeNextPlayVolumeSoundMem では
次に再生する音のみ影響を与えるので、通常音量の音と小音量の音がそれぞれ独立して音が鳴ります。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
// DXライブラリの初期化
if( DxLib_Init() == -1 )
{
return -1 ;
}
// 音の読み込み
SoundHandle = LoadSoundMem( "Test.wav" ) ;
// 「通常音量で音を再生」と「小音量で音を再生」を交互に行う
while( ProcessMessage() == 0 )
{
// 通常音量で音を再生する
ChangeNextPlayVolumeSoundMem( 255, SoundHandle ) ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ;
// 0.15秒待つ
WaitTimer( 150 ) ;
// 小音量で音を再生する
ChangeNextPlayVolumeSoundMem( 128, SoundHandle ) ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ;
// 0.15秒待つ
WaitTimer( 150 ) ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetFrequencySoundMem( int FrequencyPal , int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの再生周波数を設定する
|
引数 |
int FrequencyPal : 新たに設定する再生周波数(ヘルツ単位)
( 100~100,000 -1:デフォルトの周波数に戻す )
int SoundHandle : 再生周波数を設定する音の識別番号 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
指定の音の再生周波数を変更します。値が小さいほど、遅く低く、
値が大きいほど速く高く再生されます。
なお、音の元の再生周波数が 22.05KHz だった場合は 22050 を指定した場合が通常の再生値となり、44.10KHz だった場合は
44100 が通常の再生値となりますので注意してください。
|
|
サンプル
test.wav をループ再生させながら、再生周波数を上げたり下げたりします。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
int Freq , Add ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1;
// 音をロードする
SoundHandle = LoadSoundMem( "test.wav" ) ;
// 再生周波数と再生周波数の推移値を設定する
Freq = 22050 ;
Add = -10 ;
// ロードした音のループ再生を開始する
PlaySoundMem( SoundHandle , DX_PLAYTYPE_LOOP ) ;
// ESCキーが押されるか、システムがエラーを起こすまでループする
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 再生周波数の設定値を変化させる
Freq += Add ;
if( Freq > 100000 ){ Freq = 100000 ; Add = -10 ; }
if( Freq < 1000 ){ Freq = 1000 ; Add = 10 ; }
// 再生周波数を設定する
SetFrequencySoundMem( Freq , SoundHandle ) ;
// 少し待つ
WaitTimer( 10 ) ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
|
宣言 | int SetLoopPosSoundMem( int LoopTime, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データのループ位置を設定する
|
引数 |
int LoopTime : ループ位置(ミリ秒単位)
int SoundHandle : ループ位置を設定する音の識別番号 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
この関数は SoundHandle が示す音がループ指定で再生されたとき、
最後まで再生された後音中の何処から再度再生するかを音の先頭からの経過時間(ミリ秒単位)で指定することが出来ます。
何のためにあるのかは自ずと分かると思いますが、ループ再生の際に曲の終端まで再生した後必ず曲の先頭から再生されてしまうと、
曲の中で一回だけしか流れない前奏を入れることが出来ないからです。
前奏部分とループ部分を一緒にした音ファイルを作成し、この関数でループ部分の先頭位置を指定する事で、
前奏部分は一回だけ再生し、後は延々とループ部分のみを再生し続ける、といった事が出来るわけです。
注意!…
この関数でループ位置を設定した場合は、以後 ProcessMessage の呼び出し間隔を0.2秒以上空けないようにして下さい。
(0.2秒以上空け続けると再生中の音が途切れる現象が発生します)
また、この関数を使用してループ位置を設定したサウンドハンドルは、
以降 PlaySoundMem の第二引数で DX_PLAYTYPE_LOOP 以外を指定しても必ずループ再生されるようになります。
|
|
サンプル
testMusic.wav のループ後の位置を先頭から20秒後に設定してから再生します。
(testMusic.wav はサンプルプログラム実行用フォルダにはありませんので自前で用意してください)
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1;
// 音をロードする
SoundHandle = LoadSoundMem( "testMusic.wav" ) ;
// ループ位置を音の先頭から20秒後にセットする
SetLoopPosSoundMem( 20000, SoundHandle ) ;
// 音をループ再生する
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// キーの入力待ち
WaitKey() ;
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLoopSamplePosSoundMem( int LoopSamplePosition, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データのループ位置を設定する(サンプル位置指定)
|
引数 |
int LoopSamplePosition : ループ位置(サンプル単位)
int SoundHandle : ループ位置を設定する音の識別番号 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
『SetLoopPosSoundMem』関数 のループ位置
の指定の仕方がサンプル数になったものです。
例えば、サンプリング周波数が 44.1KHz のサウンドに対しては、引数
LoopSamplePosition に 44100 を渡すと丁度1秒の位置でループすることになります。
秒単位の指定よりも、サンプル単位の指定の方が都合が良い場合に使用します。
|
|
サンプル
ありません
|
宣言 | int SetCurrentPositionSoundMem( int SamplePosition, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの再生位置をサンプル単位で変更する
|
引数 |
int SamplePosition : 新しい再生位置(サンプル単位)
int SoundHandle : 再生位置を変更する音の識別番号 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
サウンドを扱う中では時に「音データの三秒目から再生したい」ということがあると思います、
この関数はそのような時に使用する関数で、次に PlaySoundMem の第三引数 TopPositionFlag が FALSE
で再生された際に再生され始める音データ中の位置を指定することができます。
再生位置はサンプル単位で、例えばサンプリング周波数が 44.1KHz のサウンドに対しては、引数
SamplePosition に 44100 を渡すと丁度1秒の位置を指定したことになります。
尚、この関数はサウンドの再生中に使用してもエラーになりますので、必ず再生が停止しているときに使用してください。
注意!…
この関数で再生位置を変更しても、PlaySoundMem の第三引数 TopPositionFlag に FALSE を渡さないと音データの頭から再生されてしまいますので注意してください。
|
|
サンプル
ありません
|
宣言 | int DuplicateSoundMem( int SrcSoundHandle ) ;
|
概略 | 既にメモリに読み込んである音データを使用するサウンドハンドルを新たに作成する( 非ストリームサウンドのみ )
|
引数 |
int SoundHandle : 新たに作成するサウンドハンドルが使用する音データを持っているサウンドハンドル |
戻り値 | -1以外:サウンドハンドル |
| -1:エラー発生
|
解説 |
この関数は既に LoadSoundMem 等の関数で読み込んだ音データと同じデータを使用する別のサウンドハンドルが必要になったときに使用する関数です。
例えば同じ音データを使用するキャラクターが複数居た場合、
効果音一つ一つの再生に細かく音量や停止のタイミングを決めたい場合は各キャラクター専用にサウンドハンドルを持たせたくなりますが、
キャラクターの数だけ LoadSoundMem を使用して音データをメモリに読み込むとロード時間が長くなり使用メモリも増大してしまいます。
そんなときは音データを LoadSoundMem でファイルから読み込むのは一回だけにして、
同じ音データを使用する別のサウンドハンドルが欲しいときにはその都度 DuplicateSoundMem を使用して LoadSoundMem で取得したサウンドハンドルと同じ音データを使用する別のサウンドハンドルを作成します、
こうすることで効果音の各再生毎に細かい設定や制御ができるようになり、且つ音データの読み込み時間の短縮と使用メモリの節約ができます。
尚、この関数で作成されたサウンドハンドルは LoadSoundMem で作成されたサウンドハンドルと音データを共有しているというだけで特別なサウンドハンドルというわけではありませんので、
通常のサウンドハンドルと同じく不要になったら DeleteSoundMem で削除してください。
注意!…
因みにこの関数は SetCreateSoundDataType でデフォルトタイプである DX_SOUNDDATATYPE_MEMNOPRESS 以外のストリーミングタイプの音データを指定した上で LoadSoundMem
で作成されたサウンドハンドルや、3分以上の長さのある音データから作成されたサウンドハンドルは DuplicateSoundMem の引数として渡すことはできません
|
|
サンプル
test.wav を LoadSoundMem で読み込み、同じ音データを使用するサウンドハンドルを作成してそれぞれのサウンドハンドルから音を再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle, DupSHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// test.wavを使用する SHandle とは別のサウンドハンドルを作成する
DupSHandle = DuplicateSoundMem( SHandle ) ;
// 読みこんだ音をノーマル再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_NORMAL ) ;
// SHandle から複製した DupSHandle をノーマル再生します
PlaySoundMem( DupSHandle , DX_PLAYTYPE_NORMAL ) ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DeleteSoundMem( DupSHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetCreateSoundPitchRate( float Cents ) ;
|
概略 | 作成するメモリに読み込んだ音データのピッチ( 音の長さを変えずに音程を変更する )レートを設定する
|
引数 |
float Cents : 変更する音程の高さ( 低さ )、単位はセント( 100.0f で半音、1200.0f で1オクターブ ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
この関数は LoadSoundMem で読み込む音声データの音程を変更するための関数です。
引数にどれだけ音程を高く(低く)するかを指定するための引数 Cents を渡します。単位はセントで、半音だけ音程を上げたい場合は 100.0f を、1オクターブ上げたい場合は 1200.0f を渡します。逆に下げたい場合はマイナスの値を渡します。
主に一つの音から色々な音程の音を鳴らしたい場合に使用します。
|
|
サンプル
test.wav を 1オクターブ低い音程で読み込んで再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// LoadSoundMem で読み込む音データの音程を1オクターブ低くする
SetCreateSoundPitchRate( -1200.0f ) ;
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 読みこんだ音をノーマル再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_NORMAL ) ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetCreateSoundTimeStretchRate( float Rate ) ;
|
概略 | 作成するメモリに読み込んだ音データのタイムストレッチ( 音程を変えずに音の長さを変更する )レートを設定する
|
引数 |
float Rate : 音の長さの倍率( 0.5f で半分の長さに、2.0f で倍の長さになります ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
この関数は LoadSoundMem で読み込む音声データの再生時間の長さを変更するための関数です。
引数にどれだけ再生時間を長く(短く)するかを指定するための引数 Rate を渡します。単位は倍率で、音の長さを半分にしたい場合は 0.5f を、倍の長さにしたい場合は 2.0f を渡します。
|
|
サンプル
test.wav の再生時間を2倍にして読み込んで再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// LoadSoundMem で読み込む音データの再生時間を2倍にする
SetCreateSoundTimeStretchRate( 2.0f ) ;
// test.wavのメモリへの読み込みサウンドハンドルをSHandleに保存します
SHandle = LoadSoundMem( "test.wav" ) ;
// 読みこんだ音をノーマル再生します(『PlaySoundMem』関数使用)
PlaySoundMem( SHandle , DX_PLAYTYPE_NORMAL ) ;
// サウンドハンドルの削除
DeleteSoundMem( SHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int Set3DPositionSoundMem( VECTOR Position, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの3Dサウンド用の再生位置を設定する
|
引数 |
VECTOR Position : 新しい再生位置
int SoundHandle : 再生位置を変更する音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データの音の再生位置( 3D空間の位置 )を設定します。
|
|
サンプル
test.wav を 3Dサウンドとして読み込み、ループ再生しながら音の再生位置を左右に振って、
音の再生位置が変化していることを確認するためのサンプルです。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR EmitterPos ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
float xadd ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// リスナーの向きを初期化
ListenerDir.x = 0.0f ;
ListenerDir.y = 0.0f ;
ListenerDir.z = 1.0f ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// 音の再生位置を初期化
EmitterPos = VGet( 320.0f, 0.0f, 300.0f ) ;
// 音の再生位置を設定
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// 音の再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// メインループ
xadd = 4.0f ;
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// 音の再生位置をX軸方向に移動
EmitterPos.x += xadd ;
if( EmitterPos.x > 640.0f || EmitterPos.x < 0.0f )
{
xadd = -xadd ;
EmitterPos.x += xadd ;
}
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// リスナーの位置を描画
DrawBox(
( int )( ListenerPos.x - 8 ), ( int )( 480.0f - ( ListenerPos.z + 8 ) ),
( int )( ListenerPos.x + 8 ), ( int )( 480.0f - ( ListenerPos.z - 8 ) ),
GetColor( 255,0,0 ), TRUE ) ;
// 音の再生位置を描画
DrawBox(
( int )( EmitterPos.x - 8 ), ( int )( 480.0f - ( EmitterPos.z + 8 ) ),
( int )( EmitterPos.x + 8 ), ( int )( 480.0f - ( EmitterPos.z - 8 ) ),
GetColor( 255,0,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int Set3DRadiusSoundMem( float Radius, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの3Dサウンド用の音が聞こえる距離を設定する
|
引数 |
float Radius : 音が聞こえる距離
int SoundHandle : 音が聞こえる距離を変更する音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データを再生した際の音が聞こえる距離を設定します。
|
|
サンプル
test.wav を 3Dサウンドとして読み込み、ループ再生しながら音が聞こえる距離を増減させて、
音が聞こえる範囲が変化していることを確認するためのサンプルです。
Windows用
#include "DxLib.h"
#define MIN_RADIUS (100.0f)
#define MAX_RADIUS (480.0f)
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR EmitterPos ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
float Radius ;
float AddRadius ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 360.0f ) ;
// リスナーの向きを初期化
ListenerDir.x = 0.0f ;
ListenerDir.y = 0.0f ;
ListenerDir.z = 1.0f ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音の再生位置を初期化
EmitterPos = VGet( 320.0f, 0.0f, 120.0f ) ;
// 音の再生位置を設定
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// 音が聞こえる距離を初期化
Radius = MIN_RADIUS ;
AddRadius = 4.0f ;
Set3DRadiusSoundMem( Radius, SoundHandle ) ;
// 音の再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// 音が聞こえる距離を変更
Radius += AddRadius ;
if( Radius > MAX_RADIUS || Radius < MIN_RADIUS )
{
AddRadius = -AddRadius ;
Radius += AddRadius ;
}
Set3DRadiusSoundMem( Radius, SoundHandle ) ;
// リスナーの位置を描画
DrawBox(
( int )( ListenerPos.x - 8 ), ( int )( 480.0f - ( ListenerPos.z + 8 ) ),
( int )( ListenerPos.x + 8 ), ( int )( 480.0f - ( ListenerPos.z - 8 ) ),
GetColor( 255,0,0 ), TRUE ) ;
// 音の再生位置を描画
DrawBox(
( int )( EmitterPos.x - 8 ), ( int )( 480.0f - ( EmitterPos.z + 8 ) ),
( int )( EmitterPos.x + 8 ), ( int )( 480.0f - ( EmitterPos.z - 8 ) ),
GetColor( 255,0,255 ), TRUE ) ;
// 音が聞こえる範囲を描画
DrawCircle( ( int )EmitterPos.x, ( int )EmitterPos.z, ( int )Radius, GetColor( 255,255,0 ), FALSE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int Set3DVelocitySoundMem( VECTOR Velocity, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの3Dサウンド用の移動速度を設定する
|
引数 |
VECTOR Velocity : 音の移動速度( 秒速 )
int SoundHandle : 音が聞こえる距離を変更する音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データの移動速度を設定します。
音の移動速度を設定、というと、時間経過とともに音の再生位置が変化しそうですが、変化しません。
この関数で設定する移動速度は、所謂ドップラー効果を再現するためだけに使用されるので、音の位置には影響を与えないのです。
引数 Velocity で渡す速度の値は「秒速」となります。なので、例えば秒間60フレームで動作するプログラムの場合は、
1フレームで移動した距離を60倍した値を引数に渡せば良いということになります。
( 秒間60フレームのプログラムの1フレームで経過する時間は60分の1秒、渡す値は秒速( 1秒間辺りの移動距離 )なので、1フレームで移動した距離を60倍すれば1秒間に移動する距離になる )
<注意>
ドップラー効果は XAudio2 が使用できる環境で、且つ DxLib_Init の前で SetEnableXAudioFlag に TRUE を渡して XAudio2 を使用する設定にしていた場合のみ発生します。
XAudio2 が使用できない環境や、使用できる環境でも SetEnableXAudioFlag を使用して XAudio2 を使用する設定にしていない場合はこの関数は何も効果がありませんので注意してください。
|
|
サンプル
test.wav を 3Dサウンドとして読み込み、ループ再生しながら音の再生位置を左右に振って、
ドップラー効果を確認するためのサンプルです。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR EmitterPos ;
VECTOR BackEmitterPos ;
VECTOR EmitterVel ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
float xadd ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// リスナーの向きを初期化
ListenerDir.x = 0.0f ;
ListenerDir.y = 0.0f ;
ListenerDir.z = 1.0f ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 512.0f, SoundHandle ) ;
// 音の再生位置を初期化
EmitterPos = VGet( 320.0f, 0.0f, 300.0f ) ;
// 音の再生位置を設定
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// 音の再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// メインループ
xadd = 4.0f ;
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// 移動前の音の再生位置を保存しておく
BackEmitterPos = EmitterPos ;
// 音の再生位置をX軸方向に移動
EmitterPos.x += xadd ;
if( EmitterPos.x > 640.0f || EmitterPos.x < 0.0f )
{
xadd = -xadd ;
EmitterPos.x += xadd ;
}
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// このフレームの移動距離から移動速度を算出
// ( 60分の1秒経過している前提の計算です )
EmitterVel = VScale( VSub( EmitterPos, BackEmitterPos ), 60.0f ) ;
// 音の移動速度を設定
Set3DVelocitySoundMem( EmitterVel, SoundHandle ) ;
// リスナーの位置を描画
DrawBox(
( int )( ListenerPos.x - 8 ), ( int )( 480.0f - ( ListenerPos.z + 8 ) ),
( int )( ListenerPos.x + 8 ), ( int )( 480.0f - ( ListenerPos.z - 8 ) ),
GetColor( 255,0,0 ), TRUE ) ;
// 音の再生位置を描画
DrawBox(
( int )( EmitterPos.x - 8 ), ( int )( 480.0f - ( EmitterPos.z + 8 ) ),
( int )( EmitterPos.x + 8 ), ( int )( 480.0f - ( EmitterPos.z - 8 ) ),
GetColor( 255,0,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
|
宣言 | int SetNextPlay3DPositionSoundMem( VECTOR Position, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの次の再生のみに使用する3Dサウンド用の再生位置を設定する
|
引数 |
VECTOR Position : 次に再生する音に設定する再生位置
int SoundHandle : 音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データに対して、
次に PlaySoundMem関数 で再生される音の位置を設定します。
「既に再生している音の位置は変更せずに、これから再生する音の位置だけ変更したい」という場合に使用します。
Set3DPositionSoundMem では既に再生している音の位置も変更してしまうため、
例えば打撃音など同じ音を色々な場所で鳴らす場合は、最後に音が鳴った位置に全ての音が移動してしまいます。
それを避けるためにこの関数を使用して各音がそれぞれ独立した位置で鳴るようにします。
|
|
サンプル
test.wav を 3Dサウンドとして読み込み、二つの位置で交互に音を鳴らします。
このとき SetNextPlay3DPositionSoundMem を使用しているので、二つの音の位置が独立しています。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR EmitterPos[ 2 ] ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
int PositionNumber ;
int FrameCounter ;
int i ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// リスナーの向きを初期化
ListenerDir.x = 0.0f ;
ListenerDir.y = 0.0f ;
ListenerDir.z = 1.0f ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// 音の再生位置を初期化
EmitterPos[ 0 ] = VGet( 220.0f, 0.0f, 300.0f ) ;
EmitterPos[ 1 ] = VGet( 420.0f, 0.0f, 300.0f ) ;
// 鳴らす音の番号を初期化
PositionNumber = 0 ;
// フレームカウンターを初期化
FrameCounter = 0 ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// フレームカウンターをインクリメント
FrameCounter ++ ;
// 15フレーム経過したら音を鳴らす
if( FrameCounter >= 15 )
{
// フレームカウンターを初期化
FrameCounter = 0 ;
// 次に鳴らす音の位置を設定する
SetNextPlay3DPositionSoundMem( EmitterPos[ PositionNumber ], SoundHandle ) ;
// 音を再生
PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ;
// 音を鳴らす位置の座標番号を変更
PositionNumber = ( PositionNumber + 1 ) % 2 ;
}
// リスナーの位置を描画
DrawBox(
( int )( ListenerPos.x - 8 ), ( int )( 480.0f - ( ListenerPos.z + 8 ) ),
( int )( ListenerPos.x + 8 ), ( int )( 480.0f - ( ListenerPos.z - 8 ) ),
GetColor( 255,0,0 ), TRUE ) ;
// 音の再生位置を描画
for( i = 0 ; i < 2 ; i ++ )
{
DrawBox(
( int )( EmitterPos[ i ].x - 8 ), ( int )( 480.0f - ( EmitterPos[ i ].z + 8 ) ),
( int )( EmitterPos[ i ].x + 8 ), ( int )( 480.0f - ( EmitterPos[ i ].z - 8 ) ),
GetColor( 255,0,255 ), TRUE ) ;
}
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetNextPlay3DRadiusSoundMem( float Radius, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの次の再生のみに使用する3Dサウンド用の音が聞こえる距離を設定する
|
引数 |
float Radius : 次に再生する音に設定する音が聞こえる距離
int SoundHandle : 音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データに対して、
次に PlaySoundMem関数 で再生される音が聞こえる距離を設定します。
「既に再生している音が聞こえる距離は変更せずに、これから再生する音が聞こえる距離だけ変更したい」という場合に使用します。
|
|
サンプル
ありません、「次に再生する音に対する設定」として SetNextPlay3DPositionSoundMem のサンプルが参考になると思います。
|
宣言 | int SetNextPlay3DVelocitySoundMem( VECTOR Velocity, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの次の再生のみに使用する3Dサウンド用の移動速度を設定する
|
引数 |
VECTOR Velocity : 次に再生する音に設定する移動速度( 秒速 )
int SoundHandle : 音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データに対して、
次に PlaySoundMem関数 で再生される音の移動速度を設定します。
「既に再生している音の移動速度は変更せずに、これから再生する音の移動速度だけ変更したい」という場合に使用します。
音の移動速度については Set3DVelocitySoundMem の解説を参照してください。
|
|
サンプル
ありません、「次に再生する音に対する設定」として SetNextPlay3DPositionSoundMem のサンプルが参考になると思います。
|
宣言 | int Set3DReverbParamSoundMem( const SOUND3D_REVERB_PARAM *Param, int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの3Dサウンド用のリバーブエフェクトパラメータを設定する
|
引数 |
Param : 音データに設定するリバーブエフェクトパラメータの構造体のアドレス
SoundHandle : 音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データのリバーブエフェクトのパラメータを変更します。
リバーブエフェクトのパラメータは構造体 SOUND3D_REVERB_PARAM を使用して変更します。
構造体 SOUND3D_REVERB_PARAM は XAudio2 のリバーブエフェクトパラメータ用構造体 XAUDIO2FX_REVERB_PARAMETERS そのままで、
それぞれのパラメータはサウンドの知識が無いと分からないものになっています。
<構造体 SOUND3D_REVERB_PARAM のメンバー変数>
( 引用元 : MSDN の XAUDIO2FX_REVERB_PARAMETERS 構造体の解説ページ )
// リバーブとなる出力の割合( 指定可能範囲 0.0f ~ 100.0f )
float WetDryMix ;
// ダイレクト パスに対する初期反射の遅延時間、単位はミリ秒( 指定可能範囲 0 ~ 300 )
unsigned int ReflectionsDelay ;
// 初期反射に対するリバーブの遅延時間、単位はミリ秒( 指定可能範囲 0 ~ 85 )
BYTE ReverbDelay ;
// 左後方出力および右後方出力の遅延時間、単位はミリ秒( 指定可能範囲 0 ~ 5 )
BYTE RearDelay ;
// シミュレーション空間における視聴者に対する左入力の位置( 指定可能範囲 0 ~ 30 )
// PositionLeft を最小値に設定した場合、左入力は視聴者の近くに配置されます。
// この位置では、サウンド フィールドにおいて初期反射が優勢になり、残響減衰は弱まって、振幅が小さくなります。
// PositionLeft を最大値に設定した場合、左入力はシミュレーション室内で視聴者から最大限遠い位置に配置されます。
// PositionLeft は残響減衰時間 (部屋の残響効果) に影響せず、視聴者に対する音源の見かけの位置のみに影響します。
BYTE PositionLeft ;
// PositionLeft と同効果の右入力値( 指定可能範囲 0 ~ 30 )、右入力にのみ影響を与える
BYTE PositionRight ;
// 音源から視聴者までの距離によるインプレッションを増減させる値( 指定可能範囲 0 ~ 30 )
BYTE PositionMatrixLeft ;
// 音源から視聴者までの距離によるインプレッションを増減させま値( 指定可能範囲 0 ~ 30 )
BYTE PositionMatrixRight ;
// 個々の壁の反射特性値( 指定可能範囲 0 ~ 15 )
// ( 堅く平らな表面をシミュレートするには小さな値を設定し、散乱性の表面をシミュレートするには大きな値を設定します。)
BYTE EarlyDiffusion ;
// 個々の壁のリバーブ特性値( 指定可能範囲 0 ~ 15 )、
// ( 堅く平らな表面をシミュレートするには小さな値を設定し、散乱性の表面をシミュレートするには大きな値を設定します。)
BYTE LateDiffusion ;
// 1 kHz における減衰時間を基準にして低周波数の減衰時間調整値( 指定可能範囲 0 ~ 12 )
// 値とゲイン (dB) の関係
// 値 0 1 2 3 4 5 6 7 8 9 10 11 12
// ゲイン(dB) -8 -7 -6 -5 -4 -3 -2 -1 0 +1 +2 +3 +4
// LowEQGain の値が 8 の場合、低周波数の減衰時間と 1 kHz における減衰時間が等しくなることに注意してください
BYTE LowEQGain ;
// LowEQGain パラメーターにより制御されるローパス フィルターの折点周波数の設定値( 指定可能範囲 0 ~ 9 )
// 値と周波数 (Hz) の関係
// 値 0 1 2 3 4 5 6 7 8 9
// 周波数(Hz) 50 100 150 200 250 300 350 400 450 500
BYTE LowEQCutoff ;
// 1 kHz における減衰時間を基準にして高周波数の減衰時間調整値( 指定可能範囲 0 ~ 8 )
// 値とゲイン (dB) の関係
// 値 0 1 2 3 4 5 6 7 8
// ゲイン(dB) -8 -7 -6 -5 -4 -3 -2 -1 0
// 0 に設定すると、高周波数の音が 1 kHz の場合と同じ割合で減衰します。
// 最大値に設定すると、高周波数の音が 1 kHz の場合よりもはるかに高い割合で減衰します。
BYTE HighEQGain ;
// HighEQGain パラメーターにより制御されるハイパス フィルターの折点周波数設定値( 指定可能範囲 0 ~ 14 )
// 値と周波数 (kHz) の関係
// 値 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 周波数(kHz) 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8
BYTE HighEQCutoff ;
// 室内エフェクトのローパス フィルターの折点周波数、単位は Hz ( 指定可能範囲 20.0f ~ 20000.0f )
float RoomFilterFreq ;
// 初期反射と後期フィールド残響の両方に適用されるローパス フィルターの
// パス バンド強度レベル、単位は dB ( 指定可能範囲 -100.0f ~ 0.0f )
float RoomFilterMain ;
// 折点周波数 (RoomFilterFreq) での初期反射と後期フィールド残響の両方に適用される
// ローパス フィルターのパス バンド強度レベル、単位は dB ( 指定可能範囲 -100.0f ~ 0.0f )
float RoomFilterHF ;
// 初期反射の強度/レベルを調整値、単位は dB ( 指定可能範囲 -100.0f ~ 20.0f )
float ReflectionsGain ;
// リバーブの強度/レベルを調整値、単位は dB ( 指定可能範囲 -100.0f ~ 20.0f )
float ReverbGain ;
// 1 kHz における残響減衰時間、単位は秒 ( 指定可能範囲 0.1f ~ 上限値特になし )、
// これは、フル スケールの入力信号が 60 dB 減衰するまでの時間です。
float DecayTime ;
// 後期フィールド残響のモード密度を制御値、単位はパーセント( 指定可能範囲 0.0f ~ 100.0f )
// 無色 (colorless) の空間では、Density を最大値 (100.0f ) に設定する必要があります。
// Density を小さくすると、サウンドはくぐもった音 (くし形フィルターが適用された音) になります。
// これはサイロをシミュレーションするときに有効なエフェクトです。
float Density ;
// 音響空間の見かけ上のサイズ、単位はフィート( 指定可能範囲 1.0f (30.48 cm) ~ 100.0f (30.48 m) )
float RoomSize ;
なので、通常は XAudio2 のサンプルで用意されているリバーブエフェクトパラメータのプリセットを設定する Set3DPresetReverbParamSoundMem
を使用することになると思います。
<注意>
リバーブエフェクトには XAudio2 が使用できる環境が必要で、且つ DxLib_Init の前で SetEnableXAudioFlag に TRUE を渡して XAudio2 を使用する設定にしている必要があります。
XAudio2 が使用できない環境や、使用できる環境でも SetEnableXAudioFlag を使用して XAudio2 を使用する設定にしていない場合はリバーブエフェクトの効果は得られませんので注意してください。
|
|
サンプル
test.wav を 3Dサウンドとして読み込み、リバーブエフェクトパラメータを設定してから再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
SOUND3D_REVERB_PARAM ReverbParam ;
int SoundHandle ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// リスナーの向きを初期化
ListenerDir.x = 0.0f ;
ListenerDir.y = 0.0f ;
ListenerDir.z = 1.0f ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// 音を鳴らす位置を設定する
Set3DPositionSoundMem( VGet( 320.0f, 0.0f, 300.0f ), SoundHandle ) ;
// リバーブエフェクトパラメータを設定
ReverbParam.WetDryMix = 100.0f ;
ReverbParam.ReflectionsDelay = 20 ;
ReverbParam.ReverbDelay = 29 ;
ReverbParam.RearDelay = 5 ;
ReverbParam.PositionLeft = 6 ;
ReverbParam.PositionRight = 6 ;
ReverbParam.PositionMatrixLeft = 27 ;
ReverbParam.PositionMatrixRight = 27 ;
ReverbParam.EarlyDiffusion = 15 ;
ReverbParam.LateDiffusion = 15 ;
ReverbParam.LowEQGain = 8 ;
ReverbParam.LowEQCutoff = 4 ;
ReverbParam.HighEQGain = 8 ;
ReverbParam.HighEQCutoff = 6 ;
ReverbParam.RoomFilterFreq = 5000.0f ;
ReverbParam.RoomFilterMain = -10.0f ;
ReverbParam.RoomFilterHF = -5.0f ;
ReverbParam.ReflectionsGain = -12.3f ;
ReverbParam.ReverbGain = -0.02f ;
ReverbParam.DecayTime = 3.9200001f ;
ReverbParam.Density = 100.0f ;
ReverbParam.RoomSize = 100.0f ;
Set3DReverbParamSoundMem( &ReverbParam, SoundHandle ) ;
// 音を再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// 何かキーが押されるまで待つ
WaitKey() ;
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
|
宣言 | int Set3DPresetReverbParamSoundMem( int PresetNo , int SoundHandle ) ;
|
概略 | メモリに読み込んだ音データの3Dサウンド用のリバーブエフェクトパラメータをプリセットを使用して設定する
|
引数 |
PresetNo : 音データに設定するリバーブエフェクトパラメータプリセット番号
SoundHandle : 音の識別番号( サウンドハンドル )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データのリバーブエフェクトのパラメータをプリセットを使用して変更します。
リバーブエフェクトのパラメータは難解なので、XAudio2 のサンプルとして用意されているものを使用しよう、というわけです。
PresetNo に渡せるプリセット番号は以下の通りです。
DX_REVERB_PRESET_DEFAULT // デフォルト
DX_REVERB_PRESET_GENERIC // 一般的な空間
DX_REVERB_PRESET_PADDEDCELL // 精神病患者室
DX_REVERB_PRESET_ROOM // 部屋
DX_REVERB_PRESET_BATHROOM // バスルーム
DX_REVERB_PRESET_LIVINGROOM // リビングルーム
DX_REVERB_PRESET_STONEROOM // 石の部屋
DX_REVERB_PRESET_AUDITORIUM // 講堂
DX_REVERB_PRESET_CONCERTHALL // コンサートホール
DX_REVERB_PRESET_CAVE // 洞穴
DX_REVERB_PRESET_ARENA // 舞台
DX_REVERB_PRESET_HANGAR // 格納庫
DX_REVERB_PRESET_CARPETEDHALLWAY // カーペットが敷かれた玄関
DX_REVERB_PRESET_HALLWAY // 玄関
DX_REVERB_PRESET_STONECORRIDOR // 石の廊下
DX_REVERB_PRESET_ALLEY // 裏通り
DX_REVERB_PRESET_FOREST // 森
DX_REVERB_PRESET_CITY // 都市
DX_REVERB_PRESET_MOUNTAINS // 山
DX_REVERB_PRESET_QUARRY // 採石場
DX_REVERB_PRESET_PLAIN // 平原
DX_REVERB_PRESET_PARKINGLOT // 駐車場
DX_REVERB_PRESET_SEWERPIPE // 下水管
DX_REVERB_PRESET_UNDERWATER // 水面下
DX_REVERB_PRESET_SMALLROOM // 小部屋
DX_REVERB_PRESET_MEDIUMROOM // 中部屋
DX_REVERB_PRESET_LARGEROOM // 大部屋
DX_REVERB_PRESET_MEDIUMHALL // 中ホール
DX_REVERB_PRESET_LARGEHALL // 大ホール
DX_REVERB_PRESET_PLATE // 板
<注意>
リバーブエフェクトには XAudio2 が使用できる環境が必要で、且つ DxLib_Init の前で SetEnableXAudioFlag に TRUE を渡して XAudio2 を使用する設定にしている必要があります。
XAudio2 が使用できない環境や、使用できる環境でも SetEnableXAudioFlag を使用して XAudio2 を使用する設定にしていない場合はリバーブエフェクトの効果は得られませんので注意してください。
|
|
サンプル
test.wav を 3Dサウンドとして読み込み、リバーブエフェクトパラメータをプリセットの「講堂」を使用して設定してから再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// リスナーの向きを初期化
ListenerDir.x = 0.0f ;
ListenerDir.y = 0.0f ;
ListenerDir.z = 1.0f ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// 音を鳴らす位置を設定する
Set3DPositionSoundMem( VGet( 320.0f, 0.0f, 300.0f ), SoundHandle ) ;
// リバーブエフェクトパラメータをプリセット「講堂」を使用して設定
Set3DPresetReverbParamSoundMem( DX_REVERB_PRESET_AUDITORIUM, SoundHandle ) ;
// 音を再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// 何かキーが押されるまで待つ
WaitKey() ;
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
|
宣言 | int Get3DPresetReverbParamSoundMem( SOUND3D_REVERB_PARAM *ParamBuffer, int PresetNo ) ;
|
概略 | 3Dサウンド用のプリセットのリバーブエフェクトパラメータを取得する
|
引数 |
ParamBuffer : プリセットのリバーブエフェクトパラメータを格納する構造体のアドレス
PresetNo : 取得するリバーブエフェクトパラメータのプリセット番号
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
リバーブエフェクトのパラメータを、プリセットから取得します。
主にプリセットのリバーブエフェクトパラメータが何なのか知りたいときに使用する関数です。
PresetNo に渡すプリセット番号については Set3DPresetReverbParamSoundMem の解説を参照してください。
|
|
サンプル
リバーブエフェクトパラメータのプリセット「水面下」を取得して、内容を画面に描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
SOUND3D_REVERB_PARAM ReverbParam ;
int Color ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// リバーブエフェクトパラメータのプリセット「水面下」を取得
Get3DPresetReverbParamSoundMem( &ReverbParam, DX_REVERB_PRESET_UNDERWATER ) ;
// リバーブエフェクトパラメータを画面に描画
Color = GetColor( 255,255,255 ) ;
DrawFormatString( 0, 0, Color, "WetDryMix :%f", ReverbParam.WetDryMix ) ;
DrawFormatString( 0, 16, Color, "ReflectionsDelay :%d", ReverbParam.ReflectionsDelay ) ;
DrawFormatString( 0, 32, Color, "ReverbDelay :%d", ReverbParam.ReverbDelay ) ;
DrawFormatString( 0, 48, Color, "RearDelay :%d", ReverbParam.RearDelay ) ;
DrawFormatString( 0, 64, Color, "PositionLeft :%d", ReverbParam.PositionLeft ) ;
DrawFormatString( 0, 80, Color, "PositionRight :%d", ReverbParam.PositionRight ) ;
DrawFormatString( 0, 96, Color, "PositionMatrixLeft :%d", ReverbParam.PositionMatrixLeft ) ;
DrawFormatString( 0, 112, Color, "PositionMatrixRight:%d", ReverbParam.PositionMatrixRight ) ;
DrawFormatString( 0, 128, Color, "EarlyDiffusion :%d", ReverbParam.EarlyDiffusion ) ;
DrawFormatString( 0, 144, Color, "LateDiffusion :%d", ReverbParam.LateDiffusion ) ;
DrawFormatString( 0, 160, Color, "LowEQGain :%d", ReverbParam.LowEQGain ) ;
DrawFormatString( 0, 176, Color, "LowEQCutoff :%d", ReverbParam.LowEQCutoff ) ;
DrawFormatString( 0, 192, Color, "HighEQGain :%d", ReverbParam.HighEQGain ) ;
DrawFormatString( 0, 208, Color, "HighEQCutoff :%d", ReverbParam.HighEQCutoff ) ;
DrawFormatString( 0, 224, Color, "RoomFilterFreq :%f", ReverbParam.RoomFilterFreq ) ;
DrawFormatString( 0, 240, Color, "RoomFilterMain :%f", ReverbParam.RoomFilterMain ) ;
DrawFormatString( 0, 256, Color, "RoomFilterHF :%f", ReverbParam.RoomFilterHF ) ;
DrawFormatString( 0, 272, Color, "ReflectionsGain :%f", ReverbParam.ReflectionsGain ) ;
DrawFormatString( 0, 288, Color, "ReverbGain :%f", ReverbParam.ReverbGain ) ;
DrawFormatString( 0, 304, Color, "DecayTime :%f", ReverbParam.DecayTime ) ;
DrawFormatString( 0, 320, Color, "Density :%f", ReverbParam.Density ) ;
DrawFormatString( 0, 336, Color, "RoomSize :%f", ReverbParam.RoomSize ) ;
// 何かキーが押されるまで待つ
WaitKey() ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
|
宣言 | int Set3DReverbParamSoundMemAll( const SOUND3D_REVERB_PARAM *Param, int PlaySoundOnly ) ;
|
概略 | 全てのメモリに読み込んだ音データの3Dサウンド用のリバーブエフェクトパラメータを設定する
|
引数 |
Param : 音に設定するリバーブエフェクトパラメータの構造体のアドレス
PlaySoundOnly : 再生中の音データに対してのみパラメータを設定するかどうか
( TRUE:再生中の音データに対してのみ設定
FALSE:停止中の音データも含めて全ての音データに対して設定 )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた全ての音データのリバーブエフェクトのパラメータを変更します。
リバーブエフェクトは3D空間の環境によって音データの内容に関係なく影響を与えることが殆どなので、
リバーブエフェクトのパラメータが少し変化するたびに全ての音データに対して Set3DReverbParamSoundMem
を使用するのは非効率なので、そのような場合にこの関数を使用します。
ただ、全ての音データに対してといいつつ、引数の PlaySoundOnly を TRUE にして関数を呼んだ場合は、
再生中の音データに対してのみリバーブエフェクトのパラメータを変更します。
これは、あまり無いと思いますが、頻繁にリバーブエフェクトのパラメータが変化するような場合、
その都度再生していない音データに対してもリバーブエフェクトのパラメータ変更を行うのは非効率なので、
その際は PlaySoundOnly を FLASE にして、再生中の音データに対してのみリバーブエフェクトのパラメータ変更を行うようにします。
|
|
サンプル
ありません
|
宣言 | int Set3DPresetReverbParamSoundMemAll( int PresetNo , int PlaySoundOnly ) ;
|
概略 | 全てのメモリに読み込んだ音データの3Dサウンド用のリバーブエフェクトパラメータをプリセットを使用して設定する
|
引数 |
PresetNo : 音に設定するリバーブエフェクトパラメータプリセット番号
PlaySoundOnly : 再生中の音データに対してのみパラメータを設定するかどうか
( TRUE:再生中の音データに対してのみ設定
FALSE:停止中の音データも含めて全ての音データに対して設定 )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた全ての音データのリバーブエフェクトのパラメータをプリセットを指定して変更します。
PresetNo で指定するプリセット番号については Set3DPresetReverbParamSoundMem の解説を参照してください。
リバーブエフェクトは3D空間の環境によって音データの内容に関係なく影響を与えることが殆どなので、
リバーブエフェクトのパラメータが少し変化するたびに全ての音データに対して Set3DPresetReverbParamSoundMem
を使用するのは非効率なので、そのような場合にこの関数を使用します。
ただ、全ての音データに対してといいつつ、引数の PlaySoundOnly を TRUE にして関数を呼んだ場合は、
再生中の音データに対してのみリバーブエフェクトのパラメータを変更します。
これは、あまり無いと思いますが、頻繁にリバーブエフェクトのパラメータが変化するような場合、
その都度再生していない音データに対してもリバーブエフェクトのパラメータ変更を行うのは非効率なので、
その際は PlaySoundOnly を FLASE にして、再生中の音データに対してのみリバーブエフェクトのパラメータ変更を行うようにします。
|
|
サンプル
ありません
|
宣言 | int SetCreate3DSoundFlag( int Flag ) ;
|
概略 | 次に作成するメモリに読み込む音データを3Dサウンド用にするかどうかを設定する
|
引数 |
Flag : 作成する音データを3Dサウンド用にするかどうかのフラグ
( TRUE:3Dサウンド用にする FALSE:2Dサウンド用にする( デフォルト ) )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
3Dのゲームでは映像だけではなく音も鳴っている位置とリスナー( 聞く人 )の位置によって小さく聞こえたり特定の方向から聞こえたりといった2Dゲームとの違いがあります。
DXライブラリでは2Dサウンド用の音データと3Dサウンド用の音データは区別されていて、
音データが3Dサウンド用になるか2Dサウンド用になるかは LoadSoundMem などの関数で音ファイルを読み込む前にこの関数で3Dサウンド用の音データにする設定にしていたかどうかで決まります。
そして、3Dサウンド用か2Dサウンド用かは後から変更することはできません。
<2Dサウンド用として読み込む場合>
SetCreate3DSoundFlag( FALSE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
<3Dサウンド用として読み込む場合>
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
3Dサウンド用として読み込んだ場合は、音データを PlaySoundMem で再生する前に Set3DPositionSoundMem で音の再生位置を、
Set3DRadiusSoundMem で音が聞こえる距離を設定する必要があります。
また、リスナーの位置も Set3DSoundListenerPosAndFrontPos_UpVecY などの関数で設定しておく必要があります。
( 尚、当然ですが音が届く距離よりも音の再生位置とリスナーとの距離の方が離れている場合は、音を鳴らしてもスピーカーからは何も音が聞こえません )
諸々の設定を行い実際に3Dサウンドを再生するサンプルプログラムが Set3DPositionSoundMem
のサンプルプログラムとしてありますので、参照してください。
<注意>
尚、XAudio2 が使用できる環境で、且つ DxLib_Init を呼び出す前に SetEnableXAudioFlag に TRUE を渡して XAudio2 を使用する設定にしている場合は XAudio2 を使用して正式な3Dサウンドを実現しますが、
XAudio2 が使用できない環境か若しくは DxLib_Init の呼び出し前に SetEnableXAudioFlag を使用して XAudio2 を使用する設定にしていない場合は DirectSound による擬似的な3Dサウンドとなりますので、
正式な3Dサウンド再生機能を使用したい場合は必ず SetEnableXAudioFlag を使用するようにしてください。
|
|
サンプル
Set3DPositionSoundMem のサンプルを参照してください
|
宣言 | int SetEnableXAudioFlag( int Flag ) ;
|
概略 |
サウンドの再生にXAudio2を使用するかどうかを設定する
|
引数 |
Flag : サウンドの再生に XAudio2 を使用するかどうかのフラグ
( TRUE:使用する FALSE:使用しない( デフォルト ) ) |
戻り値 |
-1:エラー発生
0:成功
|
解説 |
DXライブラリはデフォルトではサウンドの再生に DirectSound を使用していますが、
より高機能なサウンド再生機能である XAudio2 を使用したい場合はこの関数を DxLib_Init を呼び出す前に TRUE を渡して呼び出します。
尚、XAudio2 を使用した場合のメリットとデメリットは以下の通りです。
<メリット>
・3Dサウンド再生機能が使用できる。
( デフォルトの DirectSound を使用する場合は擬似3Dサウンド再生 )
・サウンドのリバーブエフェクト機能が使用できる。
<デメリット>
・CPU負荷が DirectSound よりも高い。
・環境によってはプログラムのデバッグ起動時に偶に数十秒PCがフリーズすることがある。
メリットとデメリットを踏まえると、使用するかどうかは以下の様に判断することになると思います。
「3Dのゲームを作成する場合は XAudio2 を使用して、2Dゲームを作成する場合はデフォルトの DirectSound を使用する。
また3Dゲームを作成する場合でもデバッグ起動時に偶にPCがフリーズする現象が発生する場合は、
サウンド関連の作業をする場合やリリース用ビルドを作成する場合以外では DirectSound を使用する。」
<注意>
前述の通り、この関数による設定の変更は DxLib_Init を呼ぶ前で使用した場合のみ効果がありますので注意してください。
|
|
サンプル
ありません
|
宣言 | int Set3DSoundOneMetre( float Distance ) ;
|
概略 | 3D空間の1メートルに相当する距離を設定する
|
引数 |
Distance : 3Dサウンドで1メートルに相当する距離の値
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
この関数では、Set3DPositionSoundMem などの3D座標を扱う関数での座標値が、
メートル換算ではどのような値になるかを設定します。( メートル換算された値を使用してドップラー効果などの処理が行われます )
例:3D座標での 1.0f を1メートルとして設定する
// DxLib_Init の前に Set3DSoundOneMetre に 1.0f を渡して呼ぶ
Set3DSoundOneMetre( 1.0f ) ;
if( DxLib_Init() == -1 )
{
return -1 ;
}
因みに上記の例にある通り、この関数は DxLib_Init を呼ぶ前にのみ呼ぶことができる関数です。
DxLib_Init の後に呼んでも設定を変更することができませんので注意してください。
何故このような関数があるかというと、3Dグラフィックスでは値の扱いが色々で、
例えば身長180cmのキャラクターモデルの頭の天辺の y座標が、あるモデルでは 180.0f で、
また別のモデルでは 1.8f だったりと、作り手や製作環境によって1メートルの扱いが異なるからです。
3Dグラフィックスでは 1.0f を 1メートルとするか、1センチメートルとするかは製作者同士で共通の認識ができていれば問題がありませんが、
3Dサウンドでは 1.0f が 1メートルなのか、1センチメートルなのかでドップラー効果やリバーブエフェクトの掛かり方にかなりの違いが発生するので、
この関数で明示的に「これから動作するプログラムでは1メートルは 100.0f として扱います」のようにサウンドシステムに伝えておく必要があるというわけです。
|
|
サンプル
Set3DVelocitySoundMem のサンプルを参照してください
|
宣言 | int Set3DSoundListenerPosAndFrontPos_UpVecY( VECTOR Position, VECTOR FrontPosition ) ;
|
概略 | 3Dサウンドのリスナーの位置とリスナーの前方位置を設定する
|
引数 |
VECTOR Position : リスナーの位置
VECTOR FrontPosition : リスナーの前方位置
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データが再生された際に関係するリスナー( 聞く人 )の位置と、
リスナーの向きを決定する為のリスナーの前方の位置を設定します。
尚、リスナーの位置は3Dグラフィックスで言うところのカメラの位置、リスナーの前方位置はカメラの注視点に相当するので、
SetCameraPositionAndTarget_UpVecY を使用している場合は引数をそのまま Set3DSoundListenerPosAndFrontPos_UpVecY に渡すことができます。( Position は Position、Target は FrontPosition として )
|
|
サンプル
test.wav を 3Dサウンドとして読み込みループ再生している状態で、
リスナーの位置を方向キーで、リスナーの向きをZXキーで操作できるようにしたサンプルです。
Windows用
#include "DxLib.h"
#include <math.h>
#define MOVE_SPEED 4.0f
#define ANGLE_SPEED 0.1f
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR EmitterPos ;
VECTOR ListenerPos ;
VECTOR ListenerDir ;
float ListenerAngle ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 40.0f ) ;
// リスナーの向きを初期化
ListenerAngle = DX_PI_F / 2.0f ;
ListenerDir.x = cos( ListenerAngle ) ;
ListenerDir.y = 0.0f ;
ListenerDir.z = sin( ListenerAngle ) ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// 音の再生位置を初期化
EmitterPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// 音の再生位置を設定
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// 音の再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// 方向キーでリスナーの位置を移動
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
ListenerPos.x -= MOVE_SPEED ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
ListenerPos.x += MOVE_SPEED ;
}
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
ListenerPos.z += MOVE_SPEED ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
ListenerPos.z -= MOVE_SPEED ;
}
// ZXキーで向きを変更
if( CheckHitKey( KEY_INPUT_Z ) == 1 )
{
ListenerAngle += ANGLE_SPEED ;
if( ListenerAngle > DX_PI_F )
{
ListenerAngle -= DX_TWO_PI_F ;
}
}
if( CheckHitKey( KEY_INPUT_X ) == 1 )
{
ListenerAngle -= ANGLE_SPEED ;
if( ListenerAngle < -DX_PI_F )
{
ListenerAngle += DX_TWO_PI_F ;
}
}
// リスナーの位置と向きを設定
ListenerDir.x = cos( ListenerAngle ) ;
ListenerDir.y = 0.0f ;
ListenerDir.z = sin( ListenerAngle ) ;
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// リスナーの位置を描画
DrawBox(
( int )( ListenerPos.x - 8 ), ( int )( 480.0f - ( ListenerPos.z + 8 ) ),
( int )( ListenerPos.x + 8 ), ( int )( 480.0f - ( ListenerPos.z - 8 ) ),
GetColor( 255,0,0 ), TRUE ) ;
// リスナーの向きを描画
DrawLine(
( int ) ListenerPos.x,
( int )( 480.0f - ListenerPos.z ),
( int )( ListenerPos.x + ListenerDir.x * 40.0f ),
( int )( 480.0f - ( ListenerPos.z + ListenerDir.z * 40.0f ) ),
GetColor( 255,255,255 ) ) ;
// 音の再生位置を描画
DrawBox(
( int )( EmitterPos.x - 8 ), ( int )( 480.0f - ( EmitterPos.z + 8 ) ),
( int )( EmitterPos.x + 8 ), ( int )( 480.0f - ( EmitterPos.z - 8 ) ),
GetColor( 255,0,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int Set3DSoundListenerPosAndFrontPosAndUpVec( VECTOR Position, VECTOR FrontPosition, VECTOR UpVector ) ;
|
概略 | 3Dサウンドのリスナーの位置とリスナーの前方位置とリスナーの上方向を設定する
|
引数 |
VECTOR Position : リスナーの位置
VECTOR FrontPosition : リスナーの前方位置
VECTOR UpVector: リスナーの上方向
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データが再生された際に関係するリスナー( 聞く人 )の位置と、
リスナーの向きを決定する為のリスナーの前方の位置と、リスナーの上方向を設定します。
( 因みに Set3DSoundListenerPosAndFrontPos_UpVecY ではこの関数での UpVector はY軸の方向( x = 0.0f, y = 1.0f, z = 0.0f )となっています )
尚、リスナーの位置は3Dグラフィックスで言うところのカメラの位置、リスナーの前方位置はカメラの注視点、
リスナーの上方向はカメラの上方向に相当するので、
SetCameraPositionAndTargetAndUpVec を使用している場合は引数をそのまま
Set3DSoundListenerPosAndFrontPosAndUpVec に渡すことができます。( Position は Position、Target は FrontPosition、Up は UpVector として )
|
|
サンプル
ありません
|
宣言 | int Set3DSoundListenerVelocity( VECTOR Velocity ) ;
|
概略 | 3Dサウンドのリスナーの移動速度を設定する
|
引数 |
VECTOR Velocity : リスナーの移動速度( 秒速 )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
SetCreate3DSoundFlag を使用して3Dサウンドとして読み込まれた音データが再生された際のリスナー( 聞く人 )の移動速度を設定します。
リスナーの移動速度を設定、というと、時間経過とともにリスナーの位置が変化しそうですが、変化しません。
この関数で設定する移動速度は、所謂ドップラー効果を再現するためだけに使用されるので、リスナーの位置には影響を与えないのです。
引数 Velocity で渡す速度の値は「秒速」となります。なので、例えば秒間60フレームで動作するプログラムの場合は、
1フレームで移動した距離を60倍した値を引数に渡せば良いということになります。
( 秒間60フレームのプログラムの1フレームで経過する時間は60分の1秒、渡す値は秒速( 1秒間辺りの移動距離 )なので、1フレームで移動した距離を60倍すれば1秒間に移動する距離になる )
<注意>
ドップラー効果は XAudio2 が使用できる環境で、且つ DxLib_Init の前で SetEnableXAudioFlag に TRUE を渡して XAudio2 を使用する設定にしていた場合のみ発生します。
XAudio2 が使用できない環境や、使用できる環境でも SetEnableXAudioFlag を使用して XAudio2 を使用する設定にしていない場合はこの関数は何も効果がありませんので注意してください。
|
|
サンプル
test.wav を 3Dサウンドとして読み込みループ再生している状態で、
リスナーの位置を方向キーで、リスナーの向きをZXキーで操作できるようにして、
1フレームの移動距離から移動速度を算出してドップラー効果を確認できるようにしたサンプルです。
Windows用
#include "DxLib.h"
#include <math.h>
#define MOVE_SPEED 4.0f
#define ANGLE_SPEED 0.1f
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR EmitterPos ;
VECTOR ListenerVel ;
VECTOR ListenerPos ;
VECTOR ListenerBackPos ;
VECTOR ListenerDir ;
float ListenerAngle ;
// 1メートルに相当する値を設定する
Set3DSoundOneMetre( 16.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置を初期化
ListenerPos = VGet( 320.0f, 0.0f, 40.0f ) ;
// リスナーの向きを初期化
ListenerAngle = DX_PI_F / 2.0f ;
ListenerDir.x = cos( ListenerAngle ) ;
ListenerDir.y = 0.0f ;
ListenerDir.z = sin( ListenerAngle ) ;
// リスナーの位置と向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// 音を3Dサウンドとして読み込む
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
// 音が聞こえる距離を設定する
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// 音の再生位置を初期化
EmitterPos = VGet( 320.0f, 0.0f, 240.0f ) ;
// 音の再生位置を設定
Set3DPositionSoundMem( EmitterPos, SoundHandle ) ;
// 音の再生を開始
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// 移動前のリスナーの位置を保存
ListenerBackPos = ListenerPos ;
// 方向キーでリスナーの位置を移動
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
ListenerPos.x -= MOVE_SPEED ;
}
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
ListenerPos.x += MOVE_SPEED ;
}
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
ListenerPos.z += MOVE_SPEED ;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
ListenerPos.z -= MOVE_SPEED ;
}
// ZXキーで向きを変更
if( CheckHitKey( KEY_INPUT_Z ) == 1 )
{
ListenerAngle += ANGLE_SPEED ;
if( ListenerAngle > DX_PI_F )
{
ListenerAngle -= DX_TWO_PI_F ;
}
}
if( CheckHitKey( KEY_INPUT_X ) == 1 )
{
ListenerAngle -= ANGLE_SPEED ;
if( ListenerAngle < -DX_PI_F )
{
ListenerAngle += DX_TWO_PI_F ;
}
}
// このフレームのリスナーの移動距離から移動速度を算出
// ( 60分の1秒経過している前提の計算です )
ListenerVel = VScale( VSub( ListenerPos, ListenerBackPos ), 60.0f ) ;
// リスナーの移動速度を設定
Set3DSoundListenerVelocity( ListenerVel ) ;
// リスナーの位置と向きを設定
ListenerDir.x = cos( ListenerAngle ) ;
ListenerDir.y = 0.0f ;
ListenerDir.z = sin( ListenerAngle ) ;
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, ListenerDir ) ) ;
// リスナーの位置を描画
DrawBox(
( int )( ListenerPos.x - 8 ), ( int )( 480.0f - ( ListenerPos.z + 8 ) ),
( int )( ListenerPos.x + 8 ), ( int )( 480.0f - ( ListenerPos.z - 8 ) ),
GetColor( 255,0,0 ), TRUE ) ;
// リスナーの向きを描画
DrawLine(
( int ) ListenerPos.x,
( int )( 480.0f - ListenerPos.z ),
( int )( ListenerPos.x + ListenerDir.x * 40.0f ),
( int )( 480.0f - ( ListenerPos.z + ListenerDir.z * 40.0f ) ),
GetColor( 255,255,255 ) ) ;
// 音の再生位置を描画
DrawBox(
( int )( EmitterPos.x - 8 ), ( int )( 480.0f - ( EmitterPos.z + 8 ) ),
( int )( EmitterPos.x + 8 ), ( int )( 480.0f - ( EmitterPos.z - 8 ) ),
GetColor( 255,0,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// サウンドハンドルの削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
|
音楽再生関数
|
宣言 | int PlayMusic( char *FileName , int PlayType ) ;
|
概略 | MIDI又はMP3ファイルを演奏(再生)する
|
引数 |
FileName : 演奏(再生)するMIDI又はMP3ファイルのファイルパス文字列の
ポインタ
PlayType : 演奏(再生)形式
DX_PLAYTYPE_NORMAL : ノーマル演奏(再生)
DX_PLAYTYPE_BACK : バックグラウンド演奏(再生)
DX_PLAYTYPE_LOOP : ループ演奏(再生) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
MIDI又はMP3ファイルを演奏(再生)します。
MIDIの演奏にはMCIを使用するので演奏開始までに0.5か、
それ以上の処理の一次的停止が起こります。(MP3でもタイムラグが
あります)
さらにループ演奏を指定した場合ループするときに再び0.5秒
程度の処理の停止が起こりますので、リアルタイム性の高いソフト
でのMIDI演奏には曲の1演奏辺りにかかる時間が長い曲を
使用することをお勧めします。(MP3再生では瞬時に戻ります)
(演奏形式については『PlaySoundFile』関数の解説を参照してください)
余談 WAVファイルも実は再生できます。これにより大容量
WAVファイルのストリーム再生も可能となっています。
|
|
サンプル
test.mid をノーマル演奏します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.midのノーマル演奏
PlayMusic( "test.mid" , DX_PLAYTYPE_NORMAL ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | int CheckMusic( void ) ;
|
概略 | MIDI又はMP3ファイルが演奏(再生)中かの情報を取得する
|
引数 | なし |
戻り値 |
0:演奏(再生)中ではない
1:演奏(再生)中
-1:エラー
|
解説 |
PlayMusic関数で開始したMIDI又はMP3演奏(再生)がまだ続いているか情報を
得ます。戻り値として0が返ってくれば演奏(再生)は終了しており、1が
返ってくれば演奏(再生)はまだ続いていると言うことになります。
|
|
サンプル
test.mid をバックグラウンド演奏し、演奏が終了するまで待ちます。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.midのバックグラウンド演奏
PlayMusic( "test.mid" , DX_PLAYTYPE_BACK ) ;
// 演奏終了までここでループ
while( CheckMusic() == 1 )
{
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | int StopMusic( void ) ;
|
概略 | MIDI又はMP3ファイルの演奏(再生)停止
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
PlayMusic関数で開始したMIDI又はMP3演奏(再生)を停止します
|
|
サンプル
test.midをループ再生し、2秒経ったら止めます
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// test.midのループ演奏
PlayMusic( "test.wav" , DX_PLAYTYPE_LOOP ) ;
// 2秒待つ『WaitTimer』使用
WaitTimer( 2000 ) ;
// 演奏を止めます
StopMusic() ;
// キー入力があるまで待ちます(『WaitKey』使用)
WaitKey() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | int SetVolumeMusic( int Volume ) ;
|
概略 | MIDI又はMP3ファイルの演奏(再生)の音量を設定する
|
引数 | int Volume : 音量( 0~255 ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
PlayMusic関数 で開始した演奏の音量を設定します0が無音、
255が最大音量(デフォルト)となります。
注意!…MCIを使用したMIDI演奏の場合は音量を変更することは出来ません。
|
|
サンプル
ありません。
|
戻る
|