我已经设置了一个带有Theremin的网页,我正在尝试根据正在播放的音符的频率更改网页元素的颜色。我现在生成声音的方式如下:
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
将颜色更改为osc1.frequency.value
的频率,但这并不考虑其他部分所应用的更改。
如何从这些链式元素中获得结果频率?
答案 0 :(得分:2)
您必须自己进行添加(osc1.frequency.value
+增益输出)。
获得访问增益输出的最佳当前(但见下文)方法可能是使用ScriptProcessorNode。您可以使用传递给ScriptProcessorNode的每个缓冲区中的最后一个样本,并根据您想要更新颜色的频率设置缓冲区大小。
(关于ScriptProcessorNode的注意事项:如果没有至少一个输出通道,有一个bug in Chrome and Safari会使ScriptProcessorNode无效。您可能需要使用一个输入和一个输入来创建它输出,让它将所有零发送到输出,并将其连接到目标,以使其工作。)
近期答案:您也可以尝试使用AnalyserNode,但在当前规范下,时域数据只能从AnalyserNode读取为字节,这意味着浮点样本是以某种未指定的方式转换为[0,255]范围(可能将范围[-1,1]缩放为[0,255],因此您需要的值将被剪裁)。最新的草案规范包括一个getFloatTimeDomainData方法,这可能是您最干净的解决方案。据我所知,它似乎已经在Chrome中实现,但不是Firefox。