1

私はJavascriptの音楽アプリを開発しています。

オフライン レンダリングは問題なく動作します。つまり、バッファを生成し、AudioBufferSourceNode を使用して特定の時間に再生します。タイミングはほぼ完璧です。

しかし、API のデフォルト ノードを使用して作成できないトーンを生成する必要があります。そこで、ScriptProcessorNode のコールバック内にサウンド生成ロジックを配置しました。

ScriptProcessorNode のコードが十分に高速であることはかなり確信しています。一度開始すると、必要な数のバッファー期間の間、グリッチなしでサウンドが再生されるため、時間内にバッファーを埋めることはおそらく問題ではありません。私の実験から、ScriptProcessorNode の onaudioprocess イベントは、プロセッサ ノードがいつ作成されたかに依存せずに、一定の間隔で発生することがわかりました。これにより、アプリで予測できないレイテンシが発生します。コールバックが開始された直後にユーザーがキーを押すと、次の期間が再生されるまで待機します。

それを示すために、このフィドルを作成しました。シンプルな楽器とそれを制御する 2 つのボタンがあります。事前に記録されたバッファを再生します。

function playBuffer()
{
    source = ac.createBufferSource();
    source.buffer = buffer;
    source.connect(ac.destination);
    source.start(0);
};

もう 1 つは同じサウンドをライブで再生します。

function playLive()
{
    processor = ac.createScriptProcessor(4096, 0, 1);
    processor.onaudioprocess = function(e)
    {
        sineStrument.fillBuffer(e.outputBuffer.getChannelData(0), e.outputBuffer.length);
    }
    processor.connect(ac.destination);
};

最初のボタンを使用すると、リズムを生成し、それが完璧に機能することを聞くことができます. 2 番目のボタンを使用すると、サウンドが開始するまでに約 50 ミリ秒かかるため、使用できません。

ここで、計測器が非常に単純であることに注意してください。ここでは計算速度の問題はないと思います。さらに、タイミングが合えば、クリックと同期してライブ処理されたサウンドを再生できます。 onaudioprocess コールバックが呼び出される直前にクリックするだけでよいと思います。

1) playBuffer 関数がすぐに再生され、2) playLive 関数で正確なタイミングを取得できるという事実は、ScriptProcessorNode を適切なタイミングで取得するための技術的な方法が必要であることを示しています。

どうすればいいですか?バッファの再生開始時間が固定されていないのはなぜですか?

ScriptProcessorNode のバッファ サイズも小さくしてみましたが、すぐに音が歪んでしまいます。なぜそうなのですか?コールバック内のコードが十分に高速でない場合、しばらくするとサウンドに不具合が発生することはありませんか? そうではありません!

4

1 に答える 1

-1

ScriptProcessorNode を GainNode に接続し、ゲイン値を 0 に初期化します。「Play Live」ボタンを押したときにゲイン値を 1 に設定し、放したときに 0 に設定します。

于 2013-11-07T03:06:56.407 に答える