Проблема с точностью таймеров в музыкальном приложении
Я разрабатываю простой музыкальный секвенсор на JavaScript. Для воспроизведения звуков использую аудиобиблиотеку.
Быстро понял, что setTimeout и setInterval не подходят для точной синхронизации. Их погрешность слишком большая для музыкальных целей.
Мой текущий подход
Вместо таймеров пробую такой метод:
- Создаю очередь музыкальных событий (массив с нотами и временными метками)
- Обрабатываю очередь в цикле while
Вот пример кода:
// Очередь событий: время и нота
var events = [[0, 'До'], [300, 'Ре'], [600, 'Ми']]
var startTime = Date.now()
while(events.length > 0) {
var currentTime = Date.now()
var triggerTime = events[0][0] + startTime
if(currentTime >= triggerTime) {
soundPlay(events[0][1]) // Играем ноту
events.shift() // Удаляем событие
}
}
В чем проблема
Этот метод дает нужную точность, но полностью блокирует выполнение остального JavaScript кода. Пока играет последовательность, весь остальной код замирает.
Результат: тишина во время выполнения цикла, а потом все звуки воспроизводятся одновременно.
Пробовал выносить цикл в отдельную функцию и вызывать через setTimeout, но это не решает проблему блокировки.
Вопрос: Как обработать очередь событий с точной синхронизацией, не останавливая при этом выполнение остального кода?