我試圖通過將聲音的音高分配到正弦波的路徑來將我自己的連續音調調製(顫音)添加到我的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
但是,如果你看一下這些數字,他們都沒有太大的正弦波。就我所知,原因在於,自我修飾與正弦波增量一起增加。我希望在顫音方法的音高改變之前,基音(未調製音高)保持不變。這樣做可以讓我繼續使用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。 – joejoeson
問題在於它在播放聲音時發生。爲了執行顫音,我需要將波形分配給聲音的音高: self.pitch + = newPitch; 但現在物體的音高已經改變,所以所有附加的波形增量將應用於新改變的音高。 – TheDarkIn1978
我不知道如何將顫音波形分配到基本音高,同時保持基本音高,以便在演奏過程中能夠在基本音高上更改和執行適當的顫音。當然是 – TheDarkIn1978