AudioContext: Oscillator - знать, когда все звуки были проиграны

Я использую этот javascript api (miniMusic). Я смог создать музыку, а затем экспортировать код JavaScript. Я также могу запустить его.

Я хотел бы знать, когда моя музыка закончилась, чтобы я мог играть ее снова и иметь контроль над ней.

with(new AudioContext)
for(i in D=[12,,,13,,,18,,,,,,12,,,13,,,18,,,,,,12,,,13,,,18,,,15,,,12,,,8,,,12,,,13]) {
   with(createOscillator())
   if(D[i]) {
      connect(destination) 
      frequency.value=800*1.06**(13-D[i]),
      type='square',
      start(i*.1),
      stop(i*.1+.1)
   }
}
// -> onEnd = function (...) {}

Цикл запускается мгновенно, поэтому я не могу использовать индексы, чтобы найти ноту, на которой играет музыка. Кто-нибудь может мне помочь?

1 ответ

Решение

В осцилляторе есть функция onend, которая вызывается по окончании тона, однако связанный с вами API создает новый осциллятор для каждой ноты, вы можете посчитать количество сыгранных нот, а затем выполнить цикл, когда количество нот будет равно количеству нот в мелодия

пример

with(new AudioContext)
for (i in D = [12, , , 13, , , 18, , , , , , 12, , , 13, , , 18, , , , , , 12, , , 13, , , 18, , , 15, , , 12, , , 8, , , 12, , , 13]) {
  with(createOscillator())
  if (D[i]) {
    onended = function() {
      console.log('Note has stopped playing');
    }
    connect(destination)
    frequency.value = 800 * 1.06 ** (13 - D[i]),
      type = 'square',
      start(i * .1),
      stop(i * .1 + .1)
  }
}

Надеюсь это поможет!

Другие вопросы по тегам