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


Groups > comp.lang.javascript > #36164

Re: Realtime pianoroll "scroll" logic

Newsgroups comp.lang.javascript
Date 2019-03-25 06:10 -0700
References <efe5cd64-b4ae-4553-8ad9-77422f159bcf@googlegroups.com> <e8d82946-06d5-490d-8b24-c493a3c00240@googlegroups.com> <552fc962-1a26-419f-8e42-9265343ca367@googlegroups.com> <5ce59fc3-4790-4b34-a811-b6908655f267@googlegroups.com> <98c398bb-ec87-4bd5-9d2d-6d1a1ce363c3@googlegroups.com>
Message-ID <43359102-e7be-40a3-a747-9e5404505701@googlegroups.com> (permalink)
Subject Re: Realtime pianoroll "scroll" logic
From Jonas Thörnvall <jonas.thornvall@gmail.com>

Show all headers | View raw


Den måndag 25 mars 2019 kl. 14:05:09 UTC+1 skrev Jonas Thörnvall:
> Den måndag 25 mars 2019 kl. 13:33:55 UTC+1 skrev Jonas Thörnvall:
> > Den måndag 25 mars 2019 kl. 13:29:24 UTC+1 skrev Jonas Thörnvall:
> > > Den måndag 25 mars 2019 kl. 12:59:31 UTC+1 skrev Jonas Thörnvall:
> > > > Den söndag 24 mars 2019 kl. 23:38:19 UTC+1 skrev Jonas Thörnvall:
> > > > > Recording, I now buffer the key strokes "note on and off" in an array. But the logic for a pianoroll isn't as plain and easy as i thought.
> > > > > 
> > > > > Now this is only a visual thingy so no ***exact time*** is needed for the calculation of pianoroll keystrokes "only position".
> > > > > 
> > > > > I can't see i missed any case, but the pianoroll does not behave as i expect.
> > > > > 
> > > > > CASE 1 KEY PRESSED STILL NOT RELEASED, FRONTEND MOVE INDEPENDENT OF LOCKED STARTPOINT "CALCULATE  FRONTEND RELATIVE SCROLLBAR ENTRYPOINT
> > > > > 
> > > > > CASE 2 KEY IS RELEASED, ***FIXED LENGTH*** OF KEYSTROKE CALCULATED
> > > > > 
> > > > > CASE 3 BOTH FRONTEND AND BACKEND MOVING synchronus, frontend calculated using offset relative scrollbar "same as CASE1", backend calculated using "LENGTH CASE 2" relative the frontend
> > > > > 
> > > > > I know it is hard to read others logic but i tried keep complexity to a minimum, maybe someone done something similar comoving thingy and have a good eye for logics.
> > > > > 
> > > > > http://midisequenser.000webhostapp.com/
> > > > > 
> > > > > var xKeylength=0;
> > > > > var midiEv=0;
> > > > > var xFrontStart=[];
> > > > > var FRONTOFFSET=[];
> > > > > var backStuck=0;
> > > > > var keyreleased=[];
> > > > > for (var p=0;p<300;p++) {xFrontStart[p]=0;FRONTOFFSET[p]=0;keyreleased[p]=false;}
> > > > > 
> > > > > function pianoSCROLL(){
> > > > > console.log(pianoroll.length); 
> > > > > var nbrOfEv = pianoroll.length;
> > > > >   while (midiEv<nbrOfEv){
> > > > >     
> > > > >     // Pianoroll Array Events reversed last event "keypress" ***IS FIRST***, 
> > > > >     
> > > > >     // CASE one still holding key only front moves
> > > > >     // While key not released back is stuck at start of pianoroll "stroke not released still going"
> > > > >     
> > > > >     if(pianoroll[midiEv].data0==NOTE_ON && keyreleased[midiEv]==false){
> > > > >         backStuck=keylength;
> > > > >         ctm.fillStyle = "magenta";
> > > > >         ctm.fillRect(backStuck,(PistartX+keyHeight*88)-(keyHeight*(pianoroll[midiEv].data1-8)), xFrontStart[midiEv],keyHeight);
> > > > >         //When key pressed a startpoint, relative scrollbar created ***FRONTOFFSET***
> > > > >         if(FRONTOFFSET[midiEv]==0) {FRONTOFFSET[midiEv]=scrollBarPos;}
> > > > >         xFrontStart[midiEv]=scrollBarPos-FRONTOFFSET[midiEv];
> > > > >     
> > > > >     //If a KEY EVENT Equal **released***, must find the matching KEYPRESS by looking forward 
> > > > >     //KEYPRESS should be after the keyrelease in array because "current time" insert from start.... 
> > > > > 
> > > > >     } else if(pianoroll[midiEv]==NOTE_OFF && keyreleased[midiEv]==false){
> > > > >        console.log("keyreleased!");
> > > > >        for(var q=midiEv+1;q<nbrOfEv;q++){
> > > > >        if(pianoroll[q].data1==pianoroll[midiEv].data1) {keyreleased[q]=true; xBarLength[q]=xFrontStart[q]-xBackEnd;}
> > > > >        }
> > > > >     
> > > > >     //These events should have a moving backend  in sync with the moving front
> > > > > 
> > > > >     } else  if (pianoroll[midiEv]==NOTE_OFF && keyreleased[midiEv]==true) {
> > > > >       console.log("bothmove");
> > > > >       ctm.fillStyle = "black";
> > > > >       ctm.fillRect(keylength, (PistartX+keyHeight*88)-(keyHeight*(pianoroll[midiEv]-8)), Mwidth, keyHeight+2);
> > > > >       //Math.round(all the values); maybe not needed
> > > > >       moveFront=scrollBarPos-FRONTOFFSET[midiEv];
> > > > >       moveBack=moveFront-xBarLength[midiEv];
> > > > >       ctm.fillStyle = "orange";
> > > > >       ctm.fillRect(moveBack,(PistartX+keyHeight*88)-(keyHeight*(pianoroll[midiEv]-8)),moveFront,keyHeight);
> > > > >     }
> > > > > 
> > > > >   midiEv++; 
> > > > >   }
> > > > >   midiEv=0; 
> > > > > }
> > > > 
> > > > http://midisequenser.000webhostapp.com/
> > > > 
> > > > Pressing a single key and release it while recording seem to imply wrong event used after release but i can't really see how
> > > > 
> > > > var midiEv=0;
> > > > var xFrontStart=[];
> > > > var FRONTOFFSET=[];
> > > > var xBarLength=[];
> > > > var keyreleased=[]; 
> > > > backStuck=50;
> > > > for (var p=0;p<300;p++) {xFrontStart[p]=0;FRONTOFFSET[p]=0;keyreleased[p]=false;}
> > > > 
> > > > function pianoSCROLL(){
> > > > console.log(pianoroll.length); 
> > > > var nbrOfEv = pianoroll.length;
> > > >   while (midiEv<nbrOfEv){
> > > >     
> > > >     // Pianoroll Array is reversed last keyevent "keypress / release" ***IS FIRST***, 
> > > >     // When still holding key only front moves
> > > >     // While key not released back is stuck at start of pianoroll "stroke not released still going"
> > > >     if(pianoroll[midiEv].data0==NOTE_ON && keyreleased[midiEv]==false){
> > > >         console.log("frontmove");
> > > >        
> > > >         ctm.fillStyle = "magenta";
> > > >         ctm.fillRect(backStuck,(PistartX+keyHeight*88)-(keyHeight*(pianoroll[midiEv].data1-8)), xFrontStart[midiEv],keyHeight);
> > > >         //When ***A NEW*** key pressed a startpoint relative the scrollbar created ***FRONTOFFSET***
> > > >         if(FRONTOFFSET[midiEv]==0) {FRONTOFFSET[midiEv]=scrollBarPos;}
> > > >         xFrontStart[midiEv]=scrollBarPos-FRONTOFFSET[midiEv];
> > > >         console.log("FRONTOFFSET[midiEv]="+FRONTOFFSET[midiEv]+" midiEv="+midiEv);
> > > >    
> > > >     //These events should have a moving backend  in sync with the moving front because NOTE_ON midiEv AND keyreleased[midiev]=true
> > > >     //So midiEv *fixed* barlength has been calculated above
> > > >     } else  if (pianoroll[midiEv].data0==NOTE_ON && keyreleased[midiEv]==true) {
> > > >       console.log("bothmove");
> > > >       ctm.fillStyle = "black";
> > > >       ctm.fillRect(backStuck, (PistartX+keyHeight*88)-(keyHeight*(pianoroll[midiEv].data1-8)), Mwidth, keyHeight+2);
> > > >       //Math.round(all the values); maybe not needed
> > > >       moveFront=scrollBarPos-FRONTOFFSET[midiEv];
> > > >       moveBack=moveFront-xBarLength[midiEv];
> > > >       console.log("FRONTOFFSET[midiEv]="+FRONTOFFSET[midiEv]+" midiEv="+midiEv);
> > > >       console.log("scrollBarPos="+scrollBarPos);
> > > >       console.log("moveFront="+moveFront+" moveBack="+moveBack);
> > > >       ctm.fillStyle = "orange";
> > > >       ctm.fillRect(moveBack,(PistartX+keyHeight*88)-(keyHeight*(pianoroll[midiEv].data1-8)),moveFront,keyHeight);
> > > >    
> > > >     //If a KEY EVENT Equal **released***, must find the matching KEYPRESS by looking forward 
> > > >     //KEYPRESS should be after the keyrelease in array because "current time" insert from start.... 
> > > >     } else if(pianoroll[midiEv].data0==NOTE_OFF && keyreleased[midiEv]==false){
> > > >       console.log("keyreleased!");
> > > >       for(var q=midiEv;q<nbrOfEv;q++){ 
> > > >         console.log("midiEv="+midiEv+" q="+q);
> > > >         console.log(" pianoroll[q].data0="+pianoroll[q].data0+" pianoroll[midiEv].data0="+pianoroll[midiEv].data0);
> > > >         console.log(" pianoroll[q].data1="+pianoroll[q].data1+" pianoroll[midiEv].data1="+pianoroll[midiEv].data1);
> > > >         if(pianoroll[q].data1==pianoroll[midiEv].data1) { keyreleased[q]=true; xBarLength[q]=xFrontStart[midiEv]-backStuck;}
> > > >       }
> > > >     keyreleased[midiEv]=true;
> > > >    }
> > > >   midiEv++; 
> > > >   }
> > > >   midiEv=0; 
> > > > }
> > > 
> > > Oooh i see a giant problem i have wandering indexes "i must somehow label them".
> > 
> > And i thought it was a smart idea to push them in from start, i am having second doubts.
> 
> what happen if you read thru array in loop in one thread and at same time insert elements into it with unshift() in another trhead???

It seem i have to push elements and read array from end for each setInterval calls the pianoroll animation.

No fast fix LoL?

Back to comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-24 15:38 -0700
  Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-24 22:06 -0700
    Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-25 02:44 -0700
  Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-25 04:59 -0700
    Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-25 05:29 -0700
      Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-25 05:33 -0700
        Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-25 06:04 -0700
          Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-25 06:10 -0700
          Re: Realtime pianoroll "scroll" logic John G Harris <niam@jghnorth.org.uk.invalid> - 2019-03-25 18:17 +0000
            Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-26 00:17 -0700
              Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-26 02:04 -0700
                Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-26 07:24 -0700
                Re: Realtime pianoroll "scroll" logic Jonas Thörnvall <jonas.thornvall@gmail.com> - 2019-03-26 07:46 -0700
              Re: Realtime pianoroll "scroll" logic John G Harris <niam@jghnorth.org.uk.invalid> - 2019-03-26 19:17 +0000

csiph-web