Я использую WebAudio для воспроизведения последовательности нот. У меня есть функция playNote, которая работает хорошо; Я посылаю ему частоту записок и время начала и окончания каждой заметки. Генерация параметров последовательности происходит за до фактического звучания, что немного сбивает с толку. Функция просто создает осциллятор для каждой ноты. (Я пробовал другие методы, и это самый чистый).
Но я бы хотел остановить последовательность асинхронно (например, когда происходит внешнее событие). Я попытался настроить главный узел Gain, который мог бы использоваться для управления выходом, но кажется, что он должен быть «внутри» функции, поэтому им нельзя будет управлять позже. Если я попытаюсь отключить объект усиления внутри функции, тогда будет слишком поздно - потому что время запуска и остановки уже передано функции.
Вот моя функция:
function playNote(audioContext,frequency, startTime, endTime, last) {
gainNode = audioContext.createGain(); //to get smooth rise/fall
oscillator = audioContext.createOscillator();
oscillator.frequency.value=frequency;
oscillator.connect(gainNode);
gainNode.connect(analyserScale); //analyser is global
analyserScale.connect(audioContext.destination);
gainNode.gain.exponentialRampToValueAtTime(toneOn, startTime + trf);
gainNode.gain.exponentialRampToValueAtTime(toneOff, endTime+trf);
oscillator.start(startTime);
oscillator.stop(endTime);
}
Любая помощь приветствуется!