WebAudioAPI:基于输入
情境触发信封:我试图让100%的模块化合成器在网络上WebAudioAPI:基于输入
到目前为止,我已经看到了用于制作使用的功能来触发不同阶段的信封教程信封,但是如果我想根据AudioNode的输出触发信封,该怎么办?
例如,攻击方波振荡器的上升沿,并在下降沿释放?
我不得不求助于使用脚本处理器节点(并在性能方面受到影响)还是有更好的方法来做到这一点,我还没有发现?
预先感谢
澄清:
的输入是一个简单的二进制逻辑门。当按键被按下时为1,否则为0。
应该有一些参数是AudioParams,可以控制攻击时间,衰减时间,持续时间和释放时间。假设衰减电平(ADSR包络的峰值)为1
输出是ADSR包络信号本身。
这里有一种替代方法,如果你有模拟电路,你可以区分你的方波得到前缘有正冲动,后缘有负冲动。将该脉冲串馈入RC电路。这将产生一个攻击和释放阶段。
在WebAudio中,您可以通过延迟信号一个采样并从原始信号中减去信号来做一个简单的区分。对于RC电路,您可以使用BiquadFilterNode
或IIRFilterNode
来产生所需的结果。
我不确定如果您想要更复杂的ADSR响应该怎么办。
尽管我不太明白节点用于触发的位置/方式实际上会触发某些事情(除了使用sourceNode.onended事件,最终我相信您需要使用setValueAtTime和linearRampToValueAtTime来处理信封。在一个附加的增益节点再次,你如何推导出攻击的时候,维持和释放仍是一个谜
无论如何,这是一个基本的要点我如何建立信封:
var triggerAtTime = 10;
var attackTime = 3;
var sustainTime = 5;
var releaseTime = 5;
var attackVol = 0.8;
var attackStartTime = triggerAtTime;
var attackEndTime = triggerAtTime + attackTime;
var releaseStartTime = attackEndTime + sustainTime;
var releaseEndTime = releaseStartTime + releaseTime;
var gainNode = ctx.createGain();
var gng = gainNode.gain;
gng.setValueAtTime(0, attackStartTime);
gng.linearRampToValueAtTime(attackVol, attackEndTime);
gng.setValueAtTime(attackVol, releaseStartTime);
gng.linearRampToValueAtTime(0, releaseEndTime);
sourceNode.connect(gainNode);
感谢您的回答。这是我已经拥有的,而我实际上正在寻找的是如何基于另一个节点的输出来触发setValueAtTime()和linearRampToValueAtTime()函数。在这种情况下,所有ADSR时间都被硬编码。但是,有没有办法触发这个信封,例如,基于另一个方波振荡器,其中上升沿被视为“音符开”,下降沿被视为“音符关”? – euwbah
如果另一个节点是方波,可以使用简单的滤波器来实现(至少部分)。滤波器的输入是方波,滤波器的输出设置增益节点的增益。在波的上升沿,滤波器的输出将上升到1.在后沿,滤波器的输出斜坡下降到0.这些斜坡具有某种你可能不想要的对称性。那么将需要更复杂的方案。 –
过滤器节点中的什么机制将用作回调以调整asdr。换句话说,我认为他正在寻找某种事件监听器? – bob
我想我们确实需要更多关于“其他”信号的外观以及用例的确切信息。 –
非常感谢您的回答!它在获得攻击和释放阶段方面效果很好,但我最终还需要一个衰退阶段。我会暂时使用这种方法。现在我正在试验DynamicCompressor节点以及一些信号增益和偏移量处理,以查看我是否可以获得具有可协调音频参数的完整ADSR。 – euwbah