Re: 動的に音源に前後に空白をつけたり、切り出したい ( No.1 ) |
- 名前:管理人 日時:2019/02/04 23:16
LoadSoundMemFromSoftSound を使用することでソフトウェアハンドルから通常のサウンドハンドルを
作成することができますので、最初にソフトウェアハンドルとして読み込み、必要な部分だけを別の
ソフトウェアハンドルにコピーした後、通常のサウンドハンドルとして作成することでご要望の処理が
実現できるのではないかと思います
test.wav の前後 1/3 の領域を無音にした通常のサウンドハンドルを作成して再生するサンプルプログラムを
組んでみましたので、よろしければご覧ください
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoftSoundHandle ;
int SoftSoundHandleWork ;
int SoundHandle ;
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
return -1 ;
}
// サウンドファイルをソフトウェアサウンドとして読み込み
SoftSoundHandle = LoadSoftSound( "test.wav" ) ;
// サウンドファイルと同じ長さの作業用のソフトウェアサウンドを作成
int SampleNum = GetSoftSoundSampleNum( SoftSoundHandle ) ;
SoftSoundHandleWork = MakeSoftSound( SoftSoundHandle, SampleNum ) ;
// サウンドの前後を空白にしたサウンドの作成
for( int i = 0 ; i < SampleNum ; i ++ )
{
// サウンドの前後 1/3 の領域の場合は無音をセット
if( i < SampleNum / 3 || i >= SampleNum / 3 * 2 )
{
WriteSoftSoundData( SoftSoundHandleWork, i, 0, 0 ) ;
}
else
{
int ch1, ch2 ;
// 中心 1/3 の部分の場合は元のサウンドをコピー
ReadSoftSoundData( SoftSoundHandle, i, &ch1, &ch2 ) ;
WriteSoftSoundData( SoftSoundHandleWork, i, ch1, ch2 ) ;
}
}
// 通常のサウンドハンドルを作成
SoundHandle = LoadSoundMemFromSoftSound( SoftSoundHandleWork ) ;
// ソフトサウンドハンドルは不要になったので削除
DeleteSoftSound( SoftSoundHandle ) ;
DeleteSoftSound( SoftSoundHandleWork ) ;
// 通常のサウンドハンドルを再生
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
|
Re: 動的に音源に前後に空白をつけたり、切り出したい ( No.2 ) |
- 名前:was-blue.0793 日時:2019/02/06 07:45
ご返答ありがとうございます。
時間で動的に切り出す場合は1秒あたりのサンプル数が必要ですがそのような関数はありますか?
前後に空白をつける処理はソフトウェアサウンドで意図的に空白を書き込み、その後音源データを全てコピーすれば実現できそうです。
|
Re: 動的に音源に前後に空白をつけたり、切り出したい ( No.3 ) |
- 名前:管理人 日時:2019/02/06 09:44
はい、関数 GetSoftSoundFormat で取得することができます
// ソフトウエアで扱う波形データハンドルのフォーマットを取得する
// Channels : サウンドのチャンネル数を代入する int型変数のアドレス
// BitsPerSample : サウンドの1サンプルあたりのビット数を代入する int型変数のアドレス
// SamplesPerSec : サウンドの1秒あたりのサンプル数を代入する int型変数のアドレス
int GetSoftSoundFormat( int SoftSoundHandle, int *Channels, int *BitsPerSample, int *SamplesPerSec ) ;
使用例:
int Channels, BitsPerSample, SamplesPerSec ;
GetSoftSoundFormat( SoftSoundHandle, &Channels, &BitsPerSample, &SamplesPerSec ) ;
if( SamplesPerSec == 44100 )
{
// サンプリング周波数は 44.1KHz
}
|
|