2011-10-06 71 views
0

民歌,更改PCM數據中吉他撥片的持續時間

我正在努力處理與PCM數據播放時間有關的簡單概念。我會很感激你的反饋。

我正在開發的應用程序會從音樂表中彈奏吉他筆記。

我已經實現了Jaffe-Smith算法,用於吉他撥片。

https://ccrma.stanford.edu/~jos/Mohonk05/Extended_Karplus_Strong_EKS_Algorithm.html

假設我計算一秒鐘音符A(440 Hz)的採樣。

在採樣率爲11025時,我將存儲11025個樣本,可以將這些樣本作爲PCM音頻發送到計算機揚聲器。

對於吉他上的所有獨特音符,計算所有音符的樣本需要相當長的一段時間。我想我會預先計算並將它們保存爲二進制數據,並在應用程序運行時加載它們。

到目前爲止這麼好。

現在,假設我想播放一首歌曲(各種音符清單)。假設這首歌曲需要以每分鐘100次的速度播放。比方說,我必須打一個節拍或0.6秒(60/100)的音符A.

重新計算樣本0.6秒可能需要相當長的一段時間。

我可以直接播放(11025 * 0.6)樣本嗎?這會產生副作用嗎?

有沒有更好的方法來實現我想要做的?

非常感謝您的幫助。

問候, 彼得

回答

1

什麼你基本上試圖做的是創建一個合成的吉他,是嗎?我可能會建議你改用採樣器路線。

通過示例,我的意思是一小段音頻(不是ADC或DAC意義上的單個採樣)。

基本上,您可以拼合你所需要的爲4個部分:

  • 攻擊
  • 衰減
  • 維持
  • 發佈

這四個部分的順序工作,通常被稱爲ADSR envelope。音符的攻擊是最初的聲音。對於一把吉他,你會聽到一個彈奏和一個音調的開始。衰變將成爲弦開始消失時的樣本。維持是一遍又一遍重複的樣本,直到您釋放密鑰。發佈示例是您釋放密鑰時播放的內容。對於吉他,您可能會聽到一個輕輕地將手指放回琴絃上以阻止其振動的示例。

現在,您可以實時生成所有這些樣本,但可能會佔用大量CPU資源。

關於你的問題:「我可以簡單地玩(11025 * 0.6)樣品嗎?」是的,採樣率爲11025,即0.6秒的音頻。還要記住,你應該發送連續的數據流到聲卡,用0填充任何空白點(對於帶符號的PCM)。