サウンドのピッチを正弦波のパスに割り当てることで、OpenALオブジェクトに独自の連続ピッチ変調(ビブラート)を追加しようとしています。これは私のコールバックメソッドであり、1/30秒ごとに繰り返され、ピッチのゲッターとセッターも繰り返されます。
#define kMaximumAplitude 0.025
#define kVibratoDegreeIncrements is 45
#define kDegreesToRadians(x) (M_PI * (x) / 180)
- (void)vibratoCallBack:(NSTimer *)timer
{
float newPitch = kMaximumAplitude * sin(kDegreesToRadians(vibratoDegreeIncrements));
self.pitch += newPitch;
vibratoDegreeIncrements += kVibratoDegreeIncrements;
}
- (void)setPitch:(ALfloat)newPitch
{
pitch = newPitch;
alSourcef(sourceID, AL_PITCH, pitch);
}
- (ALfloat)pitch
{
return pitch;
}
デフォルトのピッチは1.0に設定されているため、上記は次の正弦波サイクルを出力します。
Wrong Pitch: 1.000000
Wrong Pitch: 1.017678
Wrong Pitch: 1.042678
Wrong Pitch: 1.060355
Wrong Pitch: 1.060355
Wrong Pitch: 1.042678
Wrong Pitch: 1.017678
Wrong Pitch: 1.000000
ただし、これらの数値を見ると、正弦波ではありません。その理由は、私が見る限り、self.pitchが正弦波の増分とともにそれ自体を追加しているためです。ビブラート法のピッチを変更する前に、ベースピッチ(変調されていないピッチ)を一定に保ちたいと思います。そうすることで、たとえばUISliderを使用してベースピッチを制御し続けることができますが、モジュレーションエフェクトは、ベースピッチに影響を与えることなく、オプションで正確に発生させることができます。方法が見つかりません。
以下は、現在のピッチに追加したい適切な正弦波出力です。
Correct Pitch: 0.000000
Correct Pitch: 0.017678
Correct Pitch: 0.025000
Correct Pitch: 0.017678
Correct Pitch: 0.000000
Correct Pitch: -0.017678
Correct Pitch: -0.025000
Correct Pitch: -0.017678
Correct Pitch: -0.000000
したがって、現在の変調されていないピッチが1.5の場合、出力は次のようになります。
Desired Pitch: 1.500000
Desired Pitch: 1.517678
Desired Pitch: 1.525000
Desired Pitch: 1.517678
Desired Pitch: 1.500000
Desired Pitch: 1.482322
Desired Pitch: 1.475000
Desired Pitch: 1.482322
Desired Pitch: 1.500000
実際にピッチに影響を与えずにピッチを変更するにはどうすればよいですか?メソッド内で発生するモジュレーションを補正して、移動する(または移動可能な)ベースピッチでエフェクトを発生させる方法はありますか?