在改变价值的同时补偿价值变化?

时间:2010-02-06 06:23:50

标签: iphone objective-c openal waveform

我试图通过将声音的音高分配给正弦波的路径,将我自己的连续音调调制(颤音)添加到我的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

如何在不影响音高的情况下改变音高?有没有办法补偿在方法内发生的调制,以便在移动(或可移动)基础间距上发生效应?

1 个答案:

答案 0 :(得分:1)

我认为您只需要将数据分开。有一个音高存储你的基音,这将是一个未经修改的正弦波。然后你需要另一种方法来产生一个颤音声波,它与你的基音相同。然后你需要一个吸气剂来返回最终波形的当前音高。换句话说,您不需要存储最终波形的音高,就像您现在所做的那样,您只需要按需计算它。

- (ALfloat) getFinalPitch
{
return getBasePitch() + getVibratoPitch();
}