你能 sync/bind 一个 OscillatorNode 的频率与另一个吗?
Can you sync/bind one OscillatorNode's frequency with another?
所以,我正在使用网络音频创建两个 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 秒后更改了第一个振荡器的频率,但是正如您所听到的,第二个振荡器的频率也没有更新。
Web Audio API 也提供了一个我可以订阅的事件(例如 onfrequencychange
)或其他允许我在任何时候自动更新第二个振荡器频率的事件第一个改了吗?也许 binding/connecting 的某种方式
OscillatorNode.frequency (which is an 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
或其他自动化会发生什么?
所以,我正在使用网络音频创建两个 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 秒后更改了第一个振荡器的频率,但是正如您所听到的,第二个振荡器的频率也没有更新。
Web Audio API 也提供了一个我可以订阅的事件(例如 onfrequencychange
)或其他允许我在任何时候自动更新第二个振荡器频率的事件第一个改了吗?也许 binding/connecting 的某种方式
OscillatorNode.frequency (which is an 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
或其他自动化会发生什么?