2012-02-09 19 views
4

私はWeb Audio APIを使用しており、インパルスを出力するJavaScriptNodeを作成しようとしています。つまり、1を出力するノードが必要で、その後には0の束が残り、それ以外のものはありません。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

+0

正確に。インパルスは、信号処理構造をテスト/デバッグしているときに便利ですが、聞くのが楽しいとは認めていません。 ;) –

答えて

4

わかりました。

私は出力バッファ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 [0]だけでなく、毎回bufのすべての値を設定するべきでしょう。 API仕様は約束をしていないので、出力バッファにはガベージが含まれる可能性があります。 AudioBufferSourceNodeを使用すると、同じ結果をより効率的に取得することもできます。 – aldel

関連する問題