用JavaScriptNode(Web Audio API)冲动

问题描述:

我正在使用Web Audio API,并且我正在尝试创建一个输出冲动的JavaScriptNode。也就是说,我想要一个节点,输出一个1后跟一大堆零,而不是别的。用JavaScriptNode(Web Audio API)冲动

我认为下面的代码将是一个明智的方式来做到这一点。我将名为“timeForAnImpulse”的变量初始化为true,并使用此变量触发音频回调中的脉冲输出。在回调中,我将“timeForAnImpulse”设置为false。

这似乎应该可以工作,但事实并非如此。我得到了一个冲动训练(在每个缓冲区的开始处一个1),而不是一个冲动。任何想法我做错了什么?

<script type="text/javascript"> 

window.onload = init; 

    function impulseNodeCB(evt){ 

     if(timeForAnImpulse){ 
      var buf = evt.outputBuffer.getChannelData(0); 
      buf[0] = 1; 
      timeForAnImpulse = false; 
     } 
    } 

    var timeForAnImpulse = true; 

    function init() { 
     var context = new webkitAudioContext(); 
     impulseNode = context.createJavaScriptNode(2048,0,1); 
     impulseNode.onaudioprocess = impulseNodeCB; 
     impulseNode.connect(context.destination); 
    } 

</script> 

</head> 
+0

所以你只是想创建一个非常简单的“点击”?正确。 – Lloyd 2012-02-09 16:18:09

+0

没错。当你测试/调试信号处理结构时,冲动会派上用场,尽管我承认他们听起来并不好玩。 ;) – 2012-02-09 19:15:12

好吧,我想通了!

我假定在每个回调开始时输出缓冲区evt.outputBuffer.getChannelData(0)已初始化为零。事实并非如此。相反,它似乎保留了上次调用的价值。在else子句中显式调零缓冲区解决了该问题。

<script type="text/javascript"> 

window.onload = init; 

    function impulseNodeCB(evt){ 

     if(timeForAnImpulse){ 
      var buf = evt.outputBuffer.getChannelData(0); 
      buf[0] = 1; 
      timeForAnImpulse = false; 
     } else { 
      buf[0] = 0; 
     } 
    } 

    var timeForAnImpulse = true; 

    function init() { 
     var context = new webkitAudioContext(); 
     impulseNode = context.createJavaScriptNode(2048,0,1); 
     impulseNode.onaudioprocess = impulseNodeCB; 
     impulseNode.connect(context.destination); 
    } 

</script> 

</head> 
+1

你可能应该每次都在buf中设置每个值,而不仅仅是buf [0]。 API规范没有做出任何承诺,所以输出缓冲区可能包含垃圾。通过使用AudioBufferSourceNode,您也可以更高效地获得相同的结果。 – aldel 2014-09-11 14:30:30