Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.javascript > #34702 > unrolled thread

Howto achieve best possible playback timing

Started byJonas Thörnvall <jonas.thornvall@gmail.com>
First post2018-02-05 01:13 -0800
Last post2018-02-05 06:09 -0800
Articles 5 — 1 participant

Back to article view | Back to comp.lang.javascript


Contents

  Howto achieve best possible playback timing Jonas Thörnvall <jonas.thornvall@gmail.com> - 2018-02-05 01:13 -0800
    Re: Howto achieve best possible playback timing Jonas Thörnvall <jonas.thornvall@gmail.com> - 2018-02-05 02:37 -0800
      Re: Howto achieve best possible playback timing Jonas Thörnvall <jonas.thornvall@gmail.com> - 2018-02-05 02:38 -0800
        Re: Howto achieve best possible playback timing Jonas Thörnvall <jonas.thornvall@gmail.com> - 2018-02-05 02:54 -0800
        Re: Howto achieve best possible playback timing Jonas Thörnvall <jonas.thornvall@gmail.com> - 2018-02-05 06:09 -0800

#34702 — Howto achieve best possible playback timing

FromJonas Thörnvall <jonas.thornvall@gmail.com>
Date2018-02-05 01:13 -0800
SubjectHowto achieve best possible playback timing
Message-ID<edcfe79b-323f-485f-ba02-7bd7c50a4938@googlegroups.com>
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]); 
}
  

[toc] | [next] | [standalone]


#34704

FromJonas Thörnvall <jonas.thornvall@gmail.com>
Date2018-02-05 02:37 -0800
Message-ID<2ded6594-2e59-4aed-8a4a-bd4ddf62b41c@googlegroups.com>
In reply to#34702
Den måndag 5 februari 2018 kl. 10:14:03 UTC+1 skrev Jonas Thörnvall:
> 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]); 
> }

Well i can see the looping around timout is just silly, so i probably should use setInterval but with different timings.

[toc] | [prev] | [next] | [standalone]


#34705

FromJonas Thörnvall <jonas.thornvall@gmail.com>
Date2018-02-05 02:38 -0800
Message-ID<17dc4cef-227a-462a-a06d-0c0a5c2f0cf3@googlegroups.com>
In reply to#34704
Den måndag 5 februari 2018 kl. 11:37:16 UTC+1 skrev Jonas Thörnvall:
> Den måndag 5 februari 2018 kl. 10:14:03 UTC+1 skrev Jonas Thörnvall:
> > 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]); 
> > }
> 
> Well i can see the looping around timout is just silly, so i probably should use setInterval but with different timings.

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);
}

[toc] | [prev] | [next] | [standalone]


#34706

FromJonas Thörnvall <jonas.thornvall@gmail.com>
Date2018-02-05 02:54 -0800
Message-ID<47a15f8b-5897-4b04-98c0-23c5dee1275c@googlegroups.com>
In reply to#34705
Den måndag 5 februari 2018 kl. 11:38:12 UTC+1 skrev Jonas Thörnvall:
> Den måndag 5 februari 2018 kl. 11:37:16 UTC+1 skrev Jonas Thörnvall:
> > Den måndag 5 februari 2018 kl. 10:14:03 UTC+1 skrev Jonas Thörnvall:
> > > 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]); 
> > > }
> > 
> > Well i can see the looping around timout is just silly, so i probably should use setInterval but with different timings.
> 
> 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);
> }

Kind of weird that setinterval do not take an array as arguments....
So how do one do?

[toc] | [prev] | [next] | [standalone]


#34711

FromJonas Thörnvall <jonas.thornvall@gmail.com>
Date2018-02-05 06:09 -0800
Message-ID<dff93ef7-40d8-428a-b3e4-80bfd5ab15e1@googlegroups.com>
In reply to#34705
Den måndag 5 februari 2018 kl. 11:38:12 UTC+1 skrev Jonas Thörnvall:
> Den måndag 5 februari 2018 kl. 11:37:16 UTC+1 skrev Jonas Thörnvall:
> > Den måndag 5 februari 2018 kl. 10:14:03 UTC+1 skrev Jonas Thörnvall:
> > > 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]); 
> > > }
> > 
> > Well i can see the looping around timout is just silly, so i probably should use setInterval but with different timings.
> 
> 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);
> }

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]);

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.javascript


csiph-web