LoadSoftSound でソフトサウンドとして読み込むと ReadSoftSoundData で音声のサンプルデータを
取得することができますので、それを MakeSoftSoundCustom で作成したモノラルのソフトサウンドに
WriteSoftSoundData で書き込んで、作成したモノラルのソフトサウンドを LoadSoundMemFromSoftSound で
通常のサウンドハンドルにすることでステレオ音源からモノラルのサウンドハンドルを作成することができます
上記の処理を行ってステレオ音源からモノラルのサウンドハンドルを作成する処理の
サンプルを作成してみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
// 指定のチャンネルのみのモノラルサウンドハンドルを作成する
// SoundFilePath : サウンドファイルのパス
// ChannelIndex : 使用するチャンネル( 0:左 1:右 )
int MakeMonoSoundHandle( const char *SoundFilePath, int ChannelIndex )
{
int SrcSoftSoundHandle ;
int DstSoftSoundHandle ;
int SoundHandle ;
int Channels, BitsPerSample, SamplesPerSec, IsFloatType ;
LONGLONG SampleNum ;
// 指定のチャンネルは 0 か 1 のみ対応
if( ChannelIndex != 0 && ChannelIndex != 1 )
{
return -1 ;
}
// サウンドファイルをソフトサウンドとして読み込む
SrcSoftSoundHandle = LoadSoftSound( SoundFilePath ) ;
// サウンドファイルの読み込みに失敗した場合はエラー
if( SrcSoftSoundHandle < 0 )
{
return -1 ;
}
// サウンドファイルのフォーマットを取得
GetSoftSoundFormat( SrcSoftSoundHandle, &Channels, &BitsPerSample, &SamplesPerSec, &IsFloatType ) ;
// 指定のチャンネルが存在しない場合はエラー
if( Channels <= ChannelIndex )
{
return -1 ;
}
// サウンドファイルのサンプル数を取得
SampleNum = GetSoftSoundSampleNum( SrcSoftSoundHandle ) ;
// チャンネルが1つで同じビットレートのソフトサウンドハンドルを作成
DstSoftSoundHandle = MakeSoftSoundCustom( 1, BitsPerSample, SamplesPerSec, SampleNum, IsFloatType ) ;
// float型のサウンドかどうかで処理を分岐
if( IsFloatType == TRUE )
{
float Sample1F, Sample2F ;
// float型の場合
// 指定のチャンネルのサンプルデータを転送
for( int i = 0 ; i < SampleNum ; i ++ )
{
ReadSoftSoundDataF( SrcSoftSoundHandle, i, &Sample1F, &Sample2F ) ;
WriteSoftSoundDataF( DstSoftSoundHandle, i, ChannelIndex == 0 ? Sample1F : Sample2F, 0.0f ) ;
}
}
else
{
int Sample1I, Sample2I ;
// 整数型の場合
// 指定のチャンネルのサンプルデータを転送
for( int i = 0 ; i < SampleNum ; i ++ )
{
ReadSoftSoundData( SrcSoftSoundHandle, i, &Sample1I, &Sample2I ) ;
WriteSoftSoundData( DstSoftSoundHandle, i, ChannelIndex == 0 ? Sample1I : Sample2I, 0.0f ) ;
}
}
// モノラルのソフトサウンドからサウンドハンドルを作成する
SoundHandle = LoadSoundMemFromSoftSound( DstSoftSoundHandle ) ;
// ソフトサウンドハンドルを削除
DeleteSoftSound( SrcSoftSoundHandle ) ;
DeleteSoftSound( DstSoftSoundHandle ) ;
// サウンドハンドルを返す
return SoundHandle ;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// ステレオサウンドの右側だけのモノラルサウンドのハンドルを作成する
SoundHandle = MakeMonoSoundHandle( "StereoSound.wav", 1 ) ;
// 再生
PlaySoundMem( SoundHandle, DX_PLAYTYPE_NORMAL ) ;
// サウンドハンドルを削除
DeleteSoundMem( SoundHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
return 0 ;
}
上記のサンプルプログラムでは、ステレオ音源からモノラルのサウンドハンドルを作成する関数
『MakeMonoSoundHandle』を使用して、StereoSound.wav から右スピーカー用の音源のみを使用した
モノラルのサウンドハンドルを作成して、PlaySoundMem で再生しています