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 ;
}