0

サウンドのピッチを正弦波のパスに割り当てることで、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

実際にピッチに影響を与えずにピッチを変更するにはどうすればよいですか?メソッド内で発生するモジュレーションを補正して、移動する(または移動可能な)ベースピッチでエフェクトを発生させる方法はありますか?

4

1 に答える 1

1

データを分離する必要があると思います。1つのピッチにベースピッチを保存してもらいます。これは、変更されていない正弦波になります。次に、ベースピッチと同期したビブラート音波を生成する別の方法が必要です。次に、最終波形の現在のピッチを返すゲッターが必要です。つまり、現在行っているように、最終的な波形のピッチを保存する必要はありません。必要に応じて計算するだけです。

- (ALfloat) getFinalPitch
{
return getBasePitch() + getVibratoPitch();
} 
于 2010-02-06T18:17:12.143 に答える