ドキュメントによると、AudioContextはページごとに1回だけ呼び出す必要があります。AudioContextは、関数の外部で定義されたときにサウンドを生成しません。
正しく使用しようとしたときに、関数の外部で呼び出すと、サウンドが生成されません。コンテキスト変数が定義され、入力され、コンソールにエラーがスローされず、サウンドが生成されません。
「onClick」イベントごとに呼び出される関数の中で呼び出すと、最初はうまく動作しますが、呼び出す時間の限界に達したため、6回目にエラーが発生します。
var context = new AudioContext; //when defined here, no sound is produced
function playChord() {
var context = new AudioContext; //when defined here, sound is produced (only 6 times)
var time = 0.05;
var frequencies = [...];
frequencies.forEach(function(frequency) {
var oscillator = context.createOscillator();
var gain = context.createGain();
gain.gain.setValueAtTime(0, audioContext.currentTime);
gain.gain.linearRampToValueAtTime(1, time);
gain.gain.linearRampToValueAtTime(0, time + 60*0.25);
oscillator.frequency.value = frequency;
oscillator.connect(gain);
gain.connect(context.destination);
oscillator.start(...);
oscillator.stop(...);
});
};
コンテキスト変数のインスタンス化を移動するだけで、ブラウザ(クロム)の音が出なくなるのはなぜですか?
本当に 'gain.gain.doThings()'を呼びますか?それは有効ではありません。 –
ああ、6番目のコンテキストでエラーが発生するため、6つの同時コンテキストがあるChromeを実行している可能性があります。 GCを実行するには時間がかかります。 –
私は質問している質問を明確にするために質問を更新しました。私はdoStuff()を呼び出さなかったので、私はすべてを含まないことでコードを単純化しようとしていました。そして6番目のエラーは問題ではない、私は誤った使い方であることを知っている。私の問題は、文字通り黙って失敗しているということです。 – iquestionshard