javascript - 您可以将一个 OscillatorNode 的频率与另一个同步/绑定(bind)吗?

标签 javascript audio web-audio-api

所以,我正在创建两个 oscillators使用网络音频 API:

let audioCtx = new (window.AudioContext || window.webkitAudioContext)();

let o1 = audioCtx.createOscillator();
o1.type = "sawtooth";
o1.frequency.value = 220;
o1.connect(audioCtx.destination);
o1.start();

let o2 = audioCtx.createOscillator();
o2.type = "square";
o2.frequency.value = o1.frequency.value;
o2.connect(audioCtx.destination);
o2.start();

o1.frequency.setValueAtTime(392, audioCtx.currentTime + 3);

如您所见,我使用第一个振荡器的频率来设置第二个振荡器的频率。这是因为我想有效地将​​这些振荡器的声音组合在一起。 3 秒后我更改了第一个振荡器的频率,但正如您所听到的,第二个振荡器的频率也没有更新。

网络音频 API 是否提供了一个我可以订阅的事件(例如 onFrequencychange)或其他内容,使我能够在第一个振荡器出现时自动更新第二个振荡器的频率改变了?也许有某种绑定(bind)/连接的方式 OscillatorNode.frequency (这是 AudioParam )?

当然,我可以这样做:

o1.frequency.setValueAtTime(392, audioCtx.currentTime + 3);
o2.frequency.setValueAtTime(392, audioCtx.currentTime + 3);

...但是为了解决这个问题,我们假设在更新第一个振荡器的频率时,我的应用程序丢失了对第二个振荡器的引用。

本质上,我试图让两个振荡器表现得像一个。

最佳答案

目前还不清楚为什么需要两个频率完全相同的振荡器,但有一种方法可以实现这一点:

let s = new ConstantSourceNode(audioCtx, {offset: 220});
s.connect(o1.frequency);
s.connect(o2.frequency);
s.start();
...
s.offset.setValueAtTime(392, audioCtx.currentTime + 3);

因此 s 控制两个振荡器的频率。

并且没有 onFrequencychange 事件。当您可以自动化频率以更改每个样本帧时,这将如何工作,就像使用 linearRampToValueAtTime 或其他自动化会发生什么?

关于javascript - 您可以将一个 OscillatorNode 的频率与另一个同步/绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46598914/

相关文章:

javascript - 为什么我的函数会导致 TypeError <function> is not a function?

javascript - 如何在移动设备上使用 jQuery 或 css 订购商品?

javascript - getQuote() 函数完成后更改 #new-quote 元素的外层高度

java - 简短的声音文件在Netbeans中播放,但不在jar中播放

node.js - 如何在HTML5中通过客户端扬声器播放实时二进制流

javascript - 将 mp3 片段从、到并应用淡入、淡出

javascript - 尝试使用 slider 演示时,JQuery 对象 [object Object] 没有方法 'slider'

javascript - 通过将mp3文件添加到<audio>元素来获取其持续时间?

flash - 使对象对Flash中的声音使用react

javascript - 解锁网络音频的最佳解决方案