Я плохо разбираюсь в javascript, поэтому извините меня, если мой вопрос неквалифицирован.
Я пытаюсь сделать playfunction для записанных midi "timed events", они записываются с использованием performance.now, в идеале я бы хотел, чтобы setInterval принимал массив в качестве списка параметров :). Но я думаю, что это невозможно. Я не могу понять, как использовать setInterval или setTimeout с моим массивом таймингов. Я предсказываю разницу во времени между следующими событиями и хранением перед игрой, но кажется, что setInterval не изменяется, может быть, мне нужно очистить его каждый раз, прежде чем я установил новый тайм-аут?
Любая помощь оценивается, возможно, setInterval или setTimeout не идеальна для выполнения sendnote, используя список таймингов?
function play(){
lastelement=track[0].midiMess.length;
var x=0;
var waitEv=new Array();
//INIT FIRST EVENT
waitEv[x]=track[0].midiMess[x].time;
x++;
//LOOP THRU ALL EVENTS CALCULATE TIMEDIFFERENCES
while(x<lastelement){
waitEv[x]=track[0].midiMess[x].time-track[0].midiMess[x-1].time;
x++;
}
y=0;
playin=setInterval(playEvent,waitEv[y]);
}
function playEvent(){
noteOnMessage = [track[0].midiMess[y].data0,track[0].midiMess[y].data1,track[0].midiMess[y].data2];
output.send(noteOnMessage);
y++;
if (y==lastelement) clearInterval(playin);
}
Вместо того, чтобы использовать setInterval, другой вариант - это цепочка setTimeout.
Вот пример этого.
пс. обратите внимание, что setTimeouts & setInterval имеют определенные ограничения на точность, если вы обнаружите, что это недостаточно точно, другой вариант использует некоторые высокопроизводительные таймеры,..
var waitlist = [1000, 2000, 1000, 3000, 2000, 1000];
function doWait() {
if (waitlist.length) {
var waittime = waitlist.shift();
console.log("Waiting: " + waittime);
setTimeout(doWait, waittime);
}
}
//boostrap our wait loops
doWait();
while(x<lastelement)
Действительно, это заблокирует основной поток. Используйте setInterval, чтобы сделать ваш опрос, и вы должны быть в порядке.