4

私はWebAudioAPIを使用しており、インパルスを出力するJavaScriptNodeを作成しようとしています。つまり、1の後にゼロの束全体が続き、他には何も出力しないノードが必要です。

以下のコードはこれを行うための賢明な方法だと思いました。「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>
4

1 に答える 1

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>
于 2012-02-09T15:50:27.587 に答える