【问题标题】:WebAudioAPI: Trigger envelope based on inputWeb Audio API:根据输入触发包络
【发布时间】:2016-12-04 03:32:00
【问题描述】:

背景:我正在尝试在网络上制作 100% 模块化合成器

到目前为止,我看到的制作包络的教程使用函数来触发包络的不同阶段,但是如果我想根据 AudioNode 的输出来触发包络呢?

比如方波振荡器的上升沿攻击,下降沿释放?

我是否必须求助于使用脚本处理器节点(并在性能方面受到影响)还是有更好的方法来做到这一点,我还没有发现?

提前致谢

澄清:

输入是一个简单的二元门。按键按下时为 1,不按下时为 0。

应该有几个参数是 AudioParam,它们可以控制起音时间、衰减时间、延音电平和释音时间。假设衰减电平(ADSR包络的峰值)为1

输出是 ADSR 包络信号本身。

【问题讨论】:

    标签: javascript signal-processing web-audio-api


    【解决方案1】:

    这是另一种方法。如果你有模拟电路,你可以区分你的方波,在前沿得到一个正脉冲,在后沿得到一个负脉冲。将此脉冲序列馈入 RC 电路。这将产生一个攻击和释放阶段。

    在 WebAudio 中,您可以通过将信号延迟一个样本并将其从原始样本中减去来进行简单的微分。对于 RC 电路,您可以使用BiquadFilterNodeIIRFilterNode 来产生所需的结果。

    如果您想要更复杂的 ADSR 响应,我不确定该怎么做。

    【讨论】:

    • 您将使用过滤器节点中的什么机制作为回调来触发 asdr。换句话说,我认为他正在寻找某种事件监听器?
    • 我想我们真的需要更多关于“其他”信号究竟是什么样子以及用例到底是什么的信息。
    • 非常感谢您的回答!它在获得攻击和释放阶段方面效果很好,但我最终也想要一个衰减阶段。我将暂时使用这种方法。现在我正在尝试使用 DynamicCompressor 节点和一些信号增益和偏移操作,看看我是否可以获得带有可连接音频参数的完整 ADSR。
    • @bob 不,我正在寻找类似 ADSR 输出的东西,它将直接连接到 GainNode 的增益 AudioParam。
    • 我会推荐 ping Andre Michelle,他可能已经掌握了一些技巧。他也许是最有影响力的基于 Flash 的音频开发人员,并且自 Flash 衰落以来一直在转向网络音频。 andre-michelle.com
    【解决方案2】:

    虽然我不太了解用于触发的节点在何处/如何实际触发某些东西(除了使用 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 时间都已被硬编码。但是有没有办法触发这个包络,比如说,基于另一个方波振荡器,其中上升沿被视为“音符开启”,下降沿被视为“音符关闭”?
    • 如果另一个节点是方波,您可以使用简单的过滤器来实现(至少部分)。滤波器的输入是方波,滤波器的输出设置增益节点的增益。在波的上升沿,滤波器的输出将上升到 1。在下降沿,滤波器的输出下降到 0。这些斜坡具有一定的对称性,您可能不希望这样做。那么就需要一个更复杂的方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2015-09-24
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多