Я работаю над музыкальным приложением Javascript, которое включает в себя секвенсор . Для тех, кто не знаком, MIDI-секвенсоры работают примерно так: есть нечто, называемое PPQ : импульсов на четвертную ноту . Каждый импульс называется «Тик» . Он показывает, как могут быть «подразделения» на квартальную ноту, например разрешение. Таким образом, секвенсоры «воспроизводят» события, которые находятся в треках, по одному тику за раз: Play Tick1, Wait Tick Duration, Play tick2, Tick Duration и т. Д.
Теперь, скажем, у нас есть BPM (Ударов в минуту) 120 с PPQ = 96 (стандарт). Это означает, что каждая длительность квартальной ноты равна 500 мс, а каждая длительность тика - 5,20833 мс.
Какие альтернативы таймера у нас есть в Javascript?
1) У нас есть старый setTimeOut . У него есть несколько проблем: мин. Время ожидания составляет 4 мс. (https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Minimum_delay_and_timeout_nesting)
Это также зависит от изменения времени / времени. Это не является точным и требовательным, так как обратные вызовы укладываются в четный цикл.
2) Существует альтернатива setTimeOut / setInterval , которая включает использование requestAnimationFrame () . Это ОЧЕНЬ точное и эффективное использование процессора. Однако минимальное время, которое оно может быть установлено, составляет около 16,7 мс (продолжительность кадра в типичном мониторе с частотой 60 кадров в секунду)
Есть ли другая альтернатива? Чтобы точно планировать событие каждые 2-5 мс?
Примечание: функция, выполняемая в стороне от цикла, playEventsAtTick () НЕ требует вообще, поэтому выполнение никогда не займет больше времени, чем Tick Duration .
Спасибо!
Дэнни Булло