网络音频:Karplus强字符串合成

时间:2012-10-31 07:21:44

标签: javascript audio html5-audio web-audio

编辑:清理代码和播放器(在Github上),以便更容易设置频率

我是使用trying to synthesize算法的Karplus Strong string synthesis字符串,但我无法正确调整字符串。有谁有想法吗?

如上所述,代码在Github上:https://github.com/achalddave/Audio-API-Frequency-Generator(相关位在strings.js中)。

Wiki有以下图表:

Karplus Strong String Synthesis diagram

基本上,我产生噪声,然后输出并同时发送到延迟滤波器。延迟滤波器连接到低通滤波器,然后与输出混合。根据维基百科,延迟应该是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上,低通和输出之间实际上有一个增益节点,但这并没有真正对输出产生很大的影响。

0 个答案:

没有答案