我已经设置了一个带有特雷门琴的网页,并且我正在尝试根据演奏音符的频率来更改网页元素的颜色。我现在生成声音的方式如下所示:
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
+ 增益输出)。
获取增益输出的最佳当前(但见下文)方法可能是使用 ScriptProcessorNode。您可以仅使用传递到 ScriptProcessorNode 的每个缓冲区中的最后一个样本,并根据您想要更新颜色的频率设置缓冲区大小。
(关于 ScriptProcessorNode 的注意事项:如果没有至少一个输出 channel ,则有一个 bug in Chrome and Safari 会使 ScriptProcessorNode 无法工作。您可能必须使用一个输入和一个输出来创建它,让它发送所有零到输出,并将其连接到目的地,以使其工作。)
近期答案:您还可以尝试使用 AnalyserNode,但在当前规范下,时域数据只能从 AnalyserNode 以字节形式读取,这意味着浮点样本是以某种未指定的方式转换为 [0, 255] 范围内(可能将范围 [-1, 1] 缩放到 [0, 255],因此您需要的值将被剪裁)。最新的规范草案包括 getFloatTimeDomainData 方法,这可能是您最干净的解决方案。据我所知,它似乎已经在 Chrome 中实现,但在 Firefox 中还没有实现。
关于javascript - 获取链式振荡器的最终输出频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922461/