Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Howto achieve best possible playback timing

13 views
Skip to first unread message

Jonas Thörnvall

unread,
Feb 5, 2018, 4:14:03 AM2/5/18
to
I must stop poll and do some more serious playback, but i am not sure how.

function play(){
var lastelement=track[0].midiMess.length;
var x=0;var time=0; var starttime=0; var clock=0;
time=performance.now();
starttime=time;
while(x<lastelement){
var time=performance.now();
clock=time-starttime;
if(track[0].midiMess[x].time<=clock){
var noteOnMessage = [track[0].midiMess[x].data0,track[0].midiMess[x].data1,track[0].midiMess[x].data2];
output.send(noteOnMessage);
x++;
}
}
}

Well this is probably not ideal either, but better? If someone show me away to get the playup of events as accurate as possible i would be thankful.

function diffPlay(){
var lastelement=track[0].midiMess.length;
var x=0;
var waitEv=new Array();
noteOnMessage=new Array();

//INIT FIRST EVENT
waitEv[x]=track[0].midiMess[x].time;
var noteOnMessage[x] = [track[0].midiMess[x].data0,track[0].midiMess[x].data1,
track[0].midiMess[x].data2];
x++;

//LOOP THRU ALL EVENTS CALCULATE TIMEDIFFERENCES
while(x<lastelement){
waitEv[x]=track[0].midiMess[x].time-track[0].midiMess[x-1].time;
x++;
var noteOnMessage[x] [track[0].midiMess[x].data0,track[0].midiMess[x].data1,
track[0].midiMess[x].data2];
}
y=0;
while(y<lastelement){
setTimeout(playEvent,waitEv[y]);
y++;
}
}

function playEvent(){
output.send(noteOnMessage[y]);
}



Jonas Thörnvall

unread,
Feb 5, 2018, 5:37:16 AM2/5/18
to
Well i can see the looping around timout is just silly, so i probably should use setInterval but with different timings.

Jonas Thörnvall

unread,
Feb 5, 2018, 5:38:12 AM2/5/18
to
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);
}

Jonas Thörnvall

unread,
Feb 5, 2018, 5:54:53 AM2/5/18
to
Kind of weird that setinterval do not take an array as arguments....
So how do one do?

Jonas Thörnvall

unread,
Feb 5, 2018, 9:09:11 AM2/5/18
to
It seem i should probably use timeout my variable in setInterval only set value one time? waitEv[y] does not care that y arrayslot change during its execution of interval?

playin=setInterval(playEvent,waitEv[y]);
0 new messages