Вызовите setInterval или setTimeout со списком таймингов?

1

Я плохо разбираюсь в 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);
}
  • 0
    Вы могли бы просто установить цепочку setTimeout.
Теги:
setinterval

1 ответ

1

Вместо того, чтобы использовать 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();
  • 0
    Есть ли шанс, что вы могли бы показать мне, как сделать это с производительностью сейчас? Я не совсем понимаю, как можно установить фактический таймер в состояние ожидания, вам придется его опрашивать?
  • 0
    while(x<lastelement) Действительно, это заблокирует основной поток. Используйте setInterval, чтобы сделать ваш опрос, и вы должны быть в порядке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню