Gemäß der Dokumentation sollten Sie AudioContext nur einmal pro Seite aufrufen.AudioContext erzeugt keinen Ton, wenn er außerhalb einer Funktion definiert ist.
Wenn ich versuche, es korrekt zu verwenden und es außerhalb der Funktion aufzurufen, wird kein Ton ausgegeben. Die Kontextvariable ist definiert und gefüllt, es werden keine Fehler in der Konsole ausgegeben, es wird nur kein Sound erzeugt.
Wenn ich es innerhalb einer Funktion aufrufen, die jedes 'onClick' -Ereignis aufgerufen wird, funktioniert es zunächst, aber ich erstaunt beim 6. Mal, wenn ich es aufruft, da ich die Grenze der Zeiten erreicht habe, die ich aufrufen kann.
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(...);
});
};
Warum wird durch das Verschieben der Instanziierung der Kontextvariablen mein Browser (Chrome) daran gehindert, Ton zu erzeugen?
Rufen Sie wirklich do 'gain.gain.doThings()'? Das ist nicht gültig. –
Oh, und da Sie im 6. Kontext einen Fehler erhalten, wird wahrscheinlich Chrome ausgeführt, das auf 6 gleichzeitige Kontexte beschränkt ist. Es dauert einige Zeit, bis sie erkannt werden. –
Ich habe meine Frage aktualisiert, um die Frage zu klären, die ich stelle. Ich habe doStuff() nicht aufgerufen, ich habe versucht, meinen Code zu vereinfachen, indem ich nicht alles einbezog. Und der 6. Fehler ist nicht das Problem, ich weiß, dass das die falsche Verwendung ist. Mein Problem ist, dass die korrekte Verwendung wortwörtlich fehlschlägt. – iquestionshard