我对javascript不好,所以如果我的问题不正确,请原谅。
我尝试为录制的midi“定时事件”制作一个playfunction,它们是使用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 :(得分:1)
而不是使用setInterval,而是使用另一个选项来链接setTimeout。
这是一个这样做的例子。
PS。请注意setTimeouts&amp; 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();