トップページ > 記事閲覧
動的に音源に前後に空白をつけたり、切り出したい
名前:was-blue.0793 日時: 2019/02/04 08:03

読み込まれた音源に動的に前後に空白部分をつけたり、一部を切り出す必要が出てきました。 通常のサウンドハンドルでは音源に動的に空白をつけたり、一部を切り出して別のサウンドハンドルを生成することはできないと思います。 そうなりますとソフトウェアサウンドでの対応になりますが、今度は自力で音源の形式を判定してかつ曲の速度を変えたり音程を変えることができなくなると思います。(関数を失念しているだけの可能性もあります) 通常のサウンドハンドル、もしくはソフトウェアサウンドで「動的に音源に前後に空白部分をつけたり、一部を切り出す」ことは実現できるでしょうか? (一時的でも音源をファイルに書き出す方法はできれば使わない方法がいいです)
メンテ

Page: 1 |

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 }
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存