2010-02-06 51 views
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 

但是,如果你看一下這些數字,他們都沒有太大的正弦波。就我所知,原因在於,自我修飾與正弦波增量一起增加。我希望在顫音方法的音高改變之前,基音(未調製音高)保持不變。這樣做可以讓我繼續使用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

我不確定問題出在哪裏。你想基地是測量的基礎,所以爲什麼不做這樣的事情: 所需的音高= Basepitchvar +測量。 然後你可以動態地改變你的Basepitchvar。 – joejoeson

+0

問題在於它在播放聲音時發生。爲了執行顫音,我需要將波形分配給聲音的音高: self.pitch + = newPitch; 但現在物體的音高已經改變,所以所有附加的波形增量將應用於新改變的音高。 – TheDarkIn1978

+0

我不知道如何將顫音波形分配到基本音高,同時保持基本音高,以便在演奏過程中能夠在基本音高上更改和執行適當的顫音。當然是 – TheDarkIn1978

回答

1

我想你只是需要將數據分開。有一個攤位你的基本攤位,這將是一個未修改的正弦波。然後,您需要另一種方法來產生顫音聲波,這與您的基本音高同步。然後你需要一個吸氣劑來返回最終波形的當前音高。換句話說,您不需要存儲最終波形的音高,就像您現在所做的那樣,您只需要按需計算它。

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

!爲什麼我沒有意識到這一點?!謝謝!我會投你一票,但我還沒有足夠的代表。我投你精神:) – TheDarkIn1978

+0

大聲笑,只是很高興我可以幫助!我擔心我沒有清楚地解釋自己。我正在試着用手機寫字! :P – Dolph