所以,我正在创建两个 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/