获取链式振荡器的最终输出频率
Get Final Output Frequency of Chained Oscillators
我已经用特雷门建立了一个网页,我正在尝试根据播放音符的频率更改网页元素的颜色。我现在产生声音的方式是这样的:
osc1 = page.audioCX.createOscillator();
pos = getMousePos(page.canvas, ev);
osc1.frequency.value = pos.x;
gain = page.audioCX.createGain();
gain.gain.value = 60;
osc2 = page.audioCX.createOscillator();
osc2.frequency.value = 1;
osc2.connect(gain);
gain.connect(osc1.frequency);
osc1.connect(page.audioCX.destination);
它的作用是震荡 osc1
产生的声音的音高。我可以使用 osc1.frequency.value
将颜色更改为 osc1
的频率,但这不会影响其他部分应用的更改。
我怎样才能从那些链接的元素中得到合成频率?
你必须自己做加法(osc1.frequency.value
+ 增益输出)。
获得 gain 输出的最佳 current(但见下文)可能是使用 ScriptProcessorNode。您可以只使用传递给 ScriptProcessorNode 的每个缓冲区的最后一个样本,并根据您希望更新颜色的频率设置缓冲区大小。
(关于 ScriptProcessorNode 的注意事项:如果 ScriptProcessorNode 没有至少一个输出通道,则有一个 bug in Chrome and Safari 会使它无法工作。您可能必须使用一个输入和一个输出来创建它,让它将所有零发送到输出,并将它连接到目的地,让它工作。)
近期答案:您也可以尝试使用AnalyserNode,但在当前规范下,时域数据只能从AnalyserNode读取为字节,这意味着浮点样本正在以某种未指定的方式转换为 [0, 255] 范围内(可能将范围 [-1, 1] 缩放到 [0, 255],因此您需要的值将被裁剪)。最新的规范草案包括一个 getFloatTimeDomainData 方法,这可能是您最简洁的解决方案。据我所知,它似乎已经在 Chrome 中实现,但不是 Firefox。
我已经用特雷门建立了一个网页,我正在尝试根据播放音符的频率更改网页元素的颜色。我现在产生声音的方式是这样的:
osc1 = page.audioCX.createOscillator();
pos = getMousePos(page.canvas, ev);
osc1.frequency.value = pos.x;
gain = page.audioCX.createGain();
gain.gain.value = 60;
osc2 = page.audioCX.createOscillator();
osc2.frequency.value = 1;
osc2.connect(gain);
gain.connect(osc1.frequency);
osc1.connect(page.audioCX.destination);
它的作用是震荡 osc1
产生的声音的音高。我可以使用 osc1.frequency.value
将颜色更改为 osc1
的频率,但这不会影响其他部分应用的更改。
我怎样才能从那些链接的元素中得到合成频率?
你必须自己做加法(osc1.frequency.value
+ 增益输出)。
获得 gain 输出的最佳 current(但见下文)可能是使用 ScriptProcessorNode。您可以只使用传递给 ScriptProcessorNode 的每个缓冲区的最后一个样本,并根据您希望更新颜色的频率设置缓冲区大小。
(关于 ScriptProcessorNode 的注意事项:如果 ScriptProcessorNode 没有至少一个输出通道,则有一个 bug in Chrome and Safari 会使它无法工作。您可能必须使用一个输入和一个输出来创建它,让它将所有零发送到输出,并将它连接到目的地,让它工作。)
近期答案:您也可以尝试使用AnalyserNode,但在当前规范下,时域数据只能从AnalyserNode读取为字节,这意味着浮点样本正在以某种未指定的方式转换为 [0, 255] 范围内(可能将范围 [-1, 1] 缩放到 [0, 255],因此您需要的值将被裁剪)。最新的规范草案包括一个 getFloatTimeDomainData 方法,这可能是您最简洁的解决方案。据我所知,它似乎已经在 Chrome 中实现,但不是 Firefox。