【发布时间】:2010-02-06 06:23:50
【问题描述】:
我正在尝试通过将声音的音高分配给正弦波的路径,将我自己的连续音高调制(颤音)添加到我的 OpenAL 对象。这是我的回调方法,每 1/30 秒重复一次,以及音高的 getter 和 setter。
#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
如何在不真正影响音高的情况下改变音高?有没有办法补偿在方法内部发生的调制,以便在移动(或可移动)的基本音高上产生效果?
【问题讨论】:
-
我不确定问题出在哪里。您希望基础与测量无关,那么为什么不执行以下操作:期望的音高 = Basepitchvar + 测量。然后你可以动态改变你的 Basepitchvar。
-
问题在于它是在播放声音时发生的。为了执行颤音,我需要将波形分配给声音的音高: self.pitch += newPitch;但是现在对象的音高已经改变,所以所有额外的波形增量都将应用于新的改变音高。
-
我不知道如何将颤音波形分配给基本音高,同时保持基本音高,以便能够在演奏过程中在基本音高上改变和执行适当的颤音。跨度>
标签: iphone objective-c openal waveform