Эмулируйте тактовые биты MIDI в Javascript - PullRequest
2 голосов
/ 23 ноября 2011

Задача состоит в том, чтобы эмулировать работу MIDI-плеера в js, но только для эмуляции задержек между ударами.Существует массив с временем начала импульса в формате тактовых импульсов, например [960, 1280, 2200, ...], и формула, которую я использую для расчета времени в миллисекундах для каждого такта импульса:

var beatTickTime = 60000 / (tempo * 96);

Проблема в очень медленной генерации тиков в реальном времени.Даже если я использую задержку в 1 секунду, она все еще очень медленная.Вот как это было реализовано:

var tickTimer = setInterval(function() {
     ...
     tickCount += 1; 
}, beatTickTime); // or just 1 ms

Должен ли я пропустить несколько тактов, делая tickCount += someNumber?Или есть более распространенный способ решения этой проблемы?Кроме того, я не уверен насчет 96 (PPQ * 4 раза) в моей формуле.

PS такты битов получены из проанализированного файла гитары pro file

1 Ответ

2 голосов
/ 02 октября 2012

Нет гарантии, что setInterval() будет работать так быстро, как вы этого просите. Даже если время ожидания установлено на 1, вы не можете рассчитывать на то, что функция вызывается 1000 раз в секунду.

Скорее всего, вам нужно будет сделать что-то вроде следующего:

var startTime = (new Date()).getTime();
setInterval(function() {
  var relTime = (new Date()).getTime() - startTime;
  // relTime is now the number of ms since the script started

  /*
  In here, you'll need to see if relTime is large enough to indicate the next
  beat has been reached. So that means keeping some sort of external marker
  to indicate the most recent beat that has occurred -- when relTime is big
  enough to move that marker to the next beat, also run any code that is
  necessary to handle that beat.
  */
}, 1);

Цикл работает "так быстро, как может", но все еще намного медленнее, чем хотелось бы. Он измеряет текущее время относительно начала скрипта и определяет разницу на каждой итерации. Вы можете разделить это время на темп песни, и у вас будет индикатор того, где в песне вы сейчас находитесь.

...