WebAudioAPI:基于输入

时间:2016-12-04 03:32:00

标签: javascript signal-processing web-audio

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

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

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

我是否不得不求助于使用脚本处理器节点(并且性能受损)还是有更好的方法来执行此操作但我还没有找到?

提前致谢

澄清:

输入是一个简单的二进制门。按住键时为1,否则为0。

应该有一些AudioParams参数可以控制攻击时间,衰减时间,维持水平和释放时间。假设衰减水平(ADSR包络的峰值)为1

输出是ADSR包络信号本身。

2 个答案:

答案 0 :(得分:1)

虽然我不太明白用于触发的节点在何处/如何实际触发某些内容(除了使用sourceNode.onended事件之外,最终我相信你需要使用setValueAtTime和linearRampToValueAtTime处理信封。一个附加的增益节点。再次,你如何获得攻击,维持和释放的时间仍然是一个谜。

无论如何,这是我如何构建信封的基本要点:

function pMath1 () {  

  if ( m10() == false && m5() == false && last !== test) {

    lesson++; // now lesson value will increase
    last = "lesson"; // and this one will also execute

    return "Lesson " + lesson; // and when we are done, we can return and halt execution here; by this time our variables are processed.

  } else if ( m10() == false && m5() == true) {


    test++; 
    last = "test"; 

    return "Test " + test; // same approach again


  } else if ( m10() == true ) {

    inv++;
    last = "inv";

    return "Inv " + inv; // and here is our holy grail, we gave chance inv to increase first, now we are returning its incremented value. it will be no longer stick with 8.

  } else {
    console.log("pMath1 doesn't work");
  }
}

答案 1 :(得分:1)

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

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

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