編輯: - 清理代碼和播放器(在Github上)一點,所以它更容易設定頻率網絡音頻:Karplus組強大的字符串合成
我使用Karplus Strong string synthesis算法trying to synthesize字符串,但我可以」讓字符串調整正確。有人有什麼主意嗎?
如上面鏈接,代碼在Github上:https://github.com/achalddave/Audio-API-Frequency-Generator(相關位在strings.js
)。
維基下圖:
所以基本上,我生成噪聲,然後獲取輸出,並且同時發送到延遲濾波器。延遲濾波器連接到低通濾波器,然後與輸出混合。根據維基百科,延遲應該是N個採樣,其中N是採樣頻率除以基頻(N = f_s/f_0
)。
產生噪聲(bufferSize
是2048,但是這不應該太大的關係)
var buffer = context.createBuffer(1, bufferSize, context.sampleRate);
var bufferSource = context.createBufferSource();
bufferSource.buffer = buffer;
var bufferData = buffer.getChannelData(0);
for (var i = 0; i < delaySamples+1; i++) {
bufferData[i] = 2*(Math.random()-0.5); // random noise from -1 to 1
}
創建延遲節點
var delayNode = context.createDelayNode();
我們需要:
從我的代碼摘錄推遲f_s/f_0
樣本。然而,延遲節點需要幾秒鐘的延遲,所以我們需要將其除以每秒採樣,並且我們得到(f_s/f_0)/f_s
,這只是1/f_0
。
var delaySeconds = 1/(frequency);
delayNode.delayTime.value = delaySeconds;
創建低通濾波器(頻率截止,據我所知,應該不會影響頻率,更多的是字符串是否「聽」的問題自然):
var lowpassFilter = context.createBiquadFilter();
lowpassFilter.type = lowpassFilter.LOWPASS; // explicitly set type
lowpassFilter.frequency.value = 20000; // make things sound better
噪聲連接到輸出端和延遲節點(destination = context.destination
和更早被定義):
bufferSource.connect(destination);
bufferSource.connect(delayNode);
延遲連接到低通濾波器:
delayNode.connect(lowpassFilter);
低通連接到輸出,並返回到延遲*:
lowpassFilter.connect(destination);
lowpassFilter.connect(delayNode);
有沒有人有什麼想法?我無法弄清楚問題是我的代碼,我對算法的理解,我對API的理解,或者(儘管這是最不可能的)API本身的問題。
*需要注意的是在Github上,實際上是低通和輸出之間的增益節點,但這並不能真正使輸出有很大的區別。
我只是擺弄這個,我真的不知道我在做什麼。但嘗試將頻率設置爲241.在我的Mac上創建了一些奇怪的噪音。也許這會告訴你什麼?你對數學和理論看起來更加熟練。 :) –
嗯,這很有趣。說實話,除了一門EE課程外,我對這個理論也不太熟悉,其中很多東西都是拼湊在一起,四處詢問。儘管如此,感謝您的幫助,如果我更多地瞭解,這可能會提供一些見解。 –
這可能不是問題,因爲我認爲低通是默認的,但你應該在代碼中明確地設置你的過濾器類型......像'lowpassFilter.type = lowpassFilter.LOWPASS'。 –