如何通过将方波与音调相乘来创建节拍?
How to create beat by multiplying square wave with tone?
查看下面的代码。我是如何理解的:
beat
是在-1和1之间振荡的方波。
将beat
连接到multiplier.gain
会将beat
的方波添加到默认增益1。结果是在0和2之间振荡的增益.
由于 tone
连接到 multiplier
,我希望听到两秒钟的 440Hz 音调,然后停顿两秒钟,然后再次听到该音调,然后依此类推
然而,在我预计增益为 0 的地方,我仍然听到了一个音调,只是静音了。 我做错了什么?
我在 Windows 10 上使用 Chrome 74 和 Firefox 66 进行了测试。
代码:
<!doctype html>
<meta charset=utf-8>
<script>
var context = new window.AudioContext();
var tone = context.createOscillator();
var beat = context.createOscillator();
beat.frequency.value = 0.25;
beat.type = "square";
var multiplier = context.createGain();
tone.connect(multiplier);
beat.connect(multiplier.gain);
multiplier.connect(context.destination);
tone.start();
beat.start();
</script>
<button onclick="context.resume()">Play</button>
问题是 'square' 类型并没有真正在 -1 和 1 之间振荡。范围大约在 -0.848 到 0.848 之间。将 GainNode 的增益 AudioParam 设置为此值应该有效。
multiplier.gain.value = 0.848;
要查看振荡器的实际输出,例如可以使用 Canopy。它可以 运行 网络音频代码,然后可视化结果。
例如,如果您执行以下代码片段,它会显示相应的波形。
var osc = new OscillatorNode(context);
osc.type = "square";
osc.connect(context.destination);
osc.start();
希望对您有所帮助。
查看下面的代码。我是如何理解的:
beat
是在-1和1之间振荡的方波。将
beat
连接到multiplier.gain
会将beat
的方波添加到默认增益1。结果是在0和2之间振荡的增益.由于
tone
连接到multiplier
,我希望听到两秒钟的 440Hz 音调,然后停顿两秒钟,然后再次听到该音调,然后依此类推
然而,在我预计增益为 0 的地方,我仍然听到了一个音调,只是静音了。 我做错了什么?
我在 Windows 10 上使用 Chrome 74 和 Firefox 66 进行了测试。
代码:
<!doctype html>
<meta charset=utf-8>
<script>
var context = new window.AudioContext();
var tone = context.createOscillator();
var beat = context.createOscillator();
beat.frequency.value = 0.25;
beat.type = "square";
var multiplier = context.createGain();
tone.connect(multiplier);
beat.connect(multiplier.gain);
multiplier.connect(context.destination);
tone.start();
beat.start();
</script>
<button onclick="context.resume()">Play</button>
问题是 'square' 类型并没有真正在 -1 和 1 之间振荡。范围大约在 -0.848 到 0.848 之间。将 GainNode 的增益 AudioParam 设置为此值应该有效。
multiplier.gain.value = 0.848;
要查看振荡器的实际输出,例如可以使用 Canopy。它可以 运行 网络音频代码,然后可视化结果。
例如,如果您执行以下代码片段,它会显示相应的波形。
var osc = new OscillatorNode(context);
osc.type = "square";
osc.connect(context.destination);
osc.start();
希望对您有所帮助。