トップページ > 記事閲覧
ピッチを変更してwavに保存
名前:たろう 日時: 2023/01/25 18:23

いつもすみませんたろうです 読んだwavファイルのピッチを変えて外部に保存したいと考えています SetCreateSoundPitchRate( 1200.0f ) ; int h = LoadSoftSound(ファイルのパス); SaveSoftSound(h,保存先パス); DeleteSoftSound( h ) ; SetCreateSoundPitchRate( 0.0f ) ; このようにして保存したのですが、できたファイルはピッチが変わっていませんでした。 SetCreateSoundPitchRateはLoadSoundMemにしか効果がないようなのですが 保存のための関数はSoftSound用なので、変換方法など色々調べて結局行き詰りました。 正しくはどのようにしたらよいでしょうか? また、もう一つお聞きしたいのですが SetCreateSoundPitchRateを使用してwavファイルを読み込んだ場合 ユーザー側の環境で出来上がる音が変わってしまうような事はあるでしょうか? 以上二点ですが、すみませんアドバイスを頂けたらと思います。 よろしくお願いいたしますm(__)m
メンテ

Page: 1 |

Re: ピッチを変更してwavに保存 ( No.1 )
名前:管理人 日時:2023/01/26 00:30

SetCreateSoundPitchRate は LoadSoftSound などのソフトサウンドには影響を与えません ( LoadSoundMem などの通常のサウンドの読み込みにのみ影響を与えます ) ソフトサウンドには SetCreateSoundPitchRate に相当する機能がありませんので 別途 WriteTimeStretchSoftSoundData と WritePitchShiftSoftSoundData という関数を 使用して同様の効果がある処理を組む必要があります // ソフトウエアで扱う波形データハンドルの波形データを音程を変えずにデータの長さを変更する int WriteTimeStretchSoftSoundData( int SrcSoftSoundHandle, int DestSoftSoundHandle ) ; // ソフトウエアで扱う波形データハンドルの波形データの長さを変更する int WritePitchShiftSoftSoundData( int SrcSoftSoundHandle, int DestSoftSoundHandle ) ; WriteTimeStretchSoftSoundData は SrcSoftSoundHandle の波形を DestSoftSoundHandle の長さに音程を変えずに伸長するという関数で WritePitchShiftSoftSoundData は SrcSoftSoundHandle の波形を DestSoftSoundHandle の長さに音程の変化を伴いつつ伸長するという関数です これを使って、例えば WriteTimeStretchSoftSoundData を使って音程を維持したまま波形の長さを2倍にした後、 WritePitchShiftSoftSoundData を使って伸ばした波形を2分の1の長さ( 元の長さ )に戻すと、音程が1オクターブ上がります ( 2分の1にギュッと圧縮されるので、波形が短くなり音程が上がる ) という仕組みを利用して SetCreateSoundPitchRate と同じ単位の引数でソフトサウンドハンドルの 音程を変更する関数を使うサンプルを組んでみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" #include <math.h> // ソフトサウンドを指定のピッチに変更する( 単位はセント( 100.0fで半音、1200.0fで1オクターブ )、プラスの値で音程が高く、マイナスの値で音程が低くなります ) int ChangePitchRate( int SoftSoundHandle, float Cents ) { LONGLONG TempSoftSoundSampleCount ; int TempSoftSoundHandle ; // セントを倍率に変換 float PitchRate = ( float )pow( 2.0f, Cents / 1200.0f ) ; // 2倍以上に周波数があがる場合は2倍以下になるまで2倍単位で変換を行う if( PitchRate > 2.0f ) { // 2倍の長さの作業用のソフトサウンドハンドルを作成 TempSoftSoundSampleCount = ( LONGLONG )( GetSoftSoundSampleNum( SoftSoundHandle ) * 2.0 ) ; TempSoftSoundHandle = MakeSoftSound( SoftSoundHandle, TempSoftSoundSampleCount ) ; if( TempSoftSoundHandle < 0 ) { return -1 ; } // 2倍以上の間はループ while( PitchRate > 2.0f ) { // 音程を変えずに波形の長さを2倍に変換 WriteTimeStretchSoftSoundData( SoftSoundHandle, TempSoftSoundHandle ) ; // 伸ばした波形を元の長さに圧縮( 音程が変化する ) WritePitchShiftSoftSoundData( TempSoftSoundHandle, SoftSoundHandle ) ; // 圧縮した分だけ倍率を2分の1にする PitchRate /= 2.0f ; } // 作業用のソフトサウンドハンドルを削除 DeleteSoftSound( TempSoftSoundHandle ) ; } // 指定倍率の長さの作業用のソフトサウンドハンドルを作成 TempSoftSoundSampleCount = ( LONGLONG )( GetSoftSoundSampleNum( SoftSoundHandle ) * PitchRate ) ; TempSoftSoundHandle = MakeSoftSound( SoftSoundHandle, TempSoftSoundSampleCount ) ; if( TempSoftSoundHandle < 0 ) { return -1 ; } // 音程を変えずに指定倍率の長さに変換 WriteTimeStretchSoftSoundData( SoftSoundHandle, TempSoftSoundHandle ) ; // 伸ばした波形を元の長さに圧縮( 音程が変化する ) WritePitchShiftSoftSoundData( TempSoftSoundHandle, SoftSoundHandle ) ; // 作業用のソフトサウンドハンドルを削除 DeleteSoftSound( TempSoftSoundHandle ) ; // 成功 return 0 ; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // サウンドの読み込み int SoftSound = LoadSoftSound( "TestBGM.wav" ) ; // 音程を1オクターブ上げる ChangePitchRate( SoftSound, 1200.0f ) ; // サウンドハンドルとして読み込んで再生する int SoundHandle = LoadSoundMemFromSoftSound( SoftSound ) ; PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ; WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: ピッチを変更してwavに保存 ( No.2 )
名前:たろう(解決) 日時:2023/01/26 02:13

ありがとうございます 先ほどサンプルを使用させていただき ピッチの変更とwav書き出しが問題なく動作することを 確認いたしました。 今回もまたお手数をおかけしてしまいました。 重ね重ね、ありがとうございましたm(__)m
メンテ

Page: 1 |

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

   クッキー保存