





slider1:0<0,3,1{A,B,C,D}> SECTION

slider21:0<0,16,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,OFF}> SECTION_MIDI_CHAN
slider22:64<0,127,1{c-2,c#-2,d-2,d#-2,e-2,f-2,f#-2,g-2,g#-2,a-2,a#-2,h-2,c-1,c#-1,d-1,d#-1,e-1,f-1,f#-1,g-1,g#-1,a-1,a#-1,h-1,c0,c#0,d0,d#0,e0,f0,f#0,g0,g#0,a0,a#0,h0,c1,c#1,d1,d#1,e1,f1,f#1,g1,g#1,a1,a#1,h1,c2,c#2,d2,d#2,e2,f2,f#2,g2,g#2,a2,a#2,h2,c3,c#3,d3,d#3,e3,f3,f#3,g3,g#3,a3,a#3,h3,c4,c#4,d4,d#4,e4,f4,f#4,g4,g#4,a4,a#4,h4,c5,c#5,d5,d#5,e5,f5,f#5,g5,g#5,a5,a#5,h5,c6,c#6,d6,d#6,e6,f6,f#6,g6,g#6,a6,a#6,h6,c7,c#7,d7,d#7,e7,f7,f#7,g7,g#7,a7,a#7,h7,c8,c#8,d8,d#8,e8,f8,f#8,g8}> SECTION_LO_BORDER
slider23:48<0,127,1{c-2,c#-2,d-2,d#-2,e-2,f-2,f#-2,g-2,g#-2,a-2,a#-2,h-2,c-1,c#-1,d-1,d#-1,e-1,f-1,f#-1,g-1,g#-1,a-1,a#-1,h-1,c0,c#0,d0,d#0,e0,f0,f#0,g0,g#0,a0,a#0,h0,c1,c#1,d1,d#1,e1,f1,f#1,g1,g#1,a1,a#1,h1,c2,c#2,d2,d#2,e2,f2,f#2,g2,g#2,a2,a#2,h2,c3,c#3,d3,d#3,e3,f3,f#3,g3,g#3,a3,a#3,h3,c4,c#4,d4,d#4,e4,f4,f#4,g4,g#4,a4,a#4,h4,c5,c#5,d5,d#5,e5,f5,f#5,g5,g#5,a5,a#5,h5,c6,c#6,d6,d#6,e6,f6,f#6,g6,g#6,a6,a#6,h6,c7,c#7,d7,d#7,e7,f7,f#7,g7,g#7,a7,a#7,h7,c8,c#8,d8,d#8,e8,f8,f#8,g8}> SECTION_HI_BORDER
slider24:0<0,18,1{CH1,CH2,CH3,CH4,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16,SAME_CH_C-2,NO_CHANGE,OFF}> SECTION_THROUGH_TO
slider25:0<0,3,1{VELO_DRIVEN_TIME_BASED,VELO_DRIVEN_RATE_BASED,DUAL_TIME_BASED,DUAL_RATE_BASED,}> SECTION_GLIDE_MODE
slider26:0<0,100,0.1> SECTION_GLIDE_1
slider27:0<0,100,0.1> SECTION_GLIDE_2
slider28:0<0,3,1{0,50,100,LAST_PLAYED}> SECTION_SOCKET_1_IDLE_POS
slider29:0<0,3,1{0,50,100,LAST_PLAYED}> SECTION_SOCKET_2_IDLE_POS

slider40:0<0,100,0.001> !!!_PARAM_SOCKET_A1
slider41:0<0,100,0.001> !!!_PARAM_SOCKET_A2
slider42:0<0,100,0.001> !!!_PARAM_SOCKET_B1
slider43:0<0,100,0.001> !!!_PARAM_SOCKET_B2
slider44:0<0,100,0.001> !!!_PARAM_SOCKET_C1
slider45:0<0,100,0.001> !!!_PARAM_SOCKET_C2
slider46:0<0,100,0.001> !!!_PARAM_SOCKET_D1
slider47:0<0,100,0.001> !!!_PARAM_SOCKET_D2

@init //---------------------------------------------------------------------------------------


CTRL = 0;       //CTRL[XXYYYY] is a massive of controller values. 
//              XX is a section number (0:3),
//              YYYY is a parameter number (0:15).

SPRE = 256;     //conroller pre values massive
TARG_S1 = 512;   //TARG_S1[x] = 0..4 SOCKET1_target 
TARG_S2 = 516;   //TARG_S2[x] = 0..4 SOCKET1_target 
RNG=520;         //note zone range )in notes
DLT_S1=524;      //DLT_S1[x] = 0..4 SOCKET_delta
DLT_S2=528;
THR_BUF=532;    // storing THROUGH notes in row cycle to avoid dubling. HHHHH - three midi bytes one by one.
DST=536;         //DST[XYY] X=0..3 - Section number, YY=0..127  YY=offset stack storing current and previous CURR NOTE DISTANCES.
                //matrix row offset will be X*256.
                
i00=21;         //initialize prev slider position matrix
  loop
  (9,  
    SPRE[i00]=slider(i00);
    i00 += 1;
  );
  
i06=0;          //initialize prev slider position matrix
  loop
  (4,  
    THR_BUF[i06]=0;
    i06 += 1;
  );
  
dev=10;
FLAG00=0;
pst_old=0;
  
@slider //--------------------------------------------------------------------------------------

slider1!=s1pre?
(
  s1pre=slider1;
  OFST=slider1*16; //chnge CTRL matrix row
  i01=21;
  loop
  (10,  
    SPRE[i01]=slider(i01)=CTRL[OFST+i01];
    i01 += 1;
  );
):(
  slider21!=SPRE[21]?(CTRL[OFST+21]=SPRE[21]=slider21);
  slider22!=SPRE[22]?
  (
    CTRL[OFST+22]=SPRE[22]=slider22;
    slider23<slider22?(slider23=SPRE[23]=CTRL[OFST+23]=slider22); //if lo higher then hi make hi=lo
    RNG[slider1]=slider23-slider22;
  );
  slider23!=SPRE[23]?
  (
    CTRL[OFST+23]=SPRE[23]=slider23;
    slider23<slider22?(slider22=SPRE[22]=CTRL[OFST+22]=slider23);//if lo higher then hi make lo=hi
    RNG[slider1]=slider23-slider22;
  );
  i02=24;
  loop
  (6, 
    slider(i02)!=SPRE[i02]?
    CTRL[OFST+i02]=SPRE[i02]=slider(i02);
    i02 += 1;
  );
);


  

@sample //-----------------------------------------------------------------------------------------
dev-=1;
dev==0?
(
  // MIDI processing part----------------------------------------------------------------------------MIDI processing part            
  while
  (
    midirecv(offset,IN1,IN2,IN3) ?  
    (
      through=1;
      type=IN1&$xF0;
      (type==$x90)||(type==$x80) ? //is note on or note off?
      (
        i03=0; //ROW_CICLE_START!!!!!!00000000000000000000000000000000000000000000000000000000000000000000000000000000000//0
        loop //by section matrix rows                                                                                    //0
        (4,                                                                                                              //0
          OFST1=i03*16; //for controller matrix                                                                          //0
          OFST2=i03*256; //for distance matrix                                                                           //0
          IN1&$x0F==CTRL[21+OFST1]? //is chanel present in CTRL matrix?                                                  //0
          (                                                                                                              //0
            (IN2>=CTRL[OFST1+22])&&(IN2<=CTRL[OFST1+23])?// is in key zone set?                                          //0
            (                                                                                                             //0
  //  MIDI_MAIN START ===============================================================================  MIDI_MAIN START    //0
              distance=IN2-CTRL[22+OFST1]+1;                                                                        //   //0
              velo100=IN3/1.27; //velocity in percent;                                                              //   //0
              i04=0;                                                                                                //   //0
              while((DST[i04+OFST2]>0)&&(i04<128))                                                                  //   //0
              (                                                                                                     //   //0
                DST[i04+OFST2]==distance? //is same distance present at note on stack?                              //   //0
                (                                                                                                   //   //0
                  memcpy(DST+OFST2+i04+0,DST+OFST2+i04+1,128-i04); //take off this distance from stack              //   //0
                  i04=127; //for loop braking                                                                       //   //0
                );                                                                                                  //   //0
              i04+=1;                                                                                                //   //0
              );                                                                                                    //   //0
                                                                                                                    //   //0
              (IN1&$xF0==$x90) && (IN3>0) ? //is note on?                                                           //   //0
              (                                                                                                     //   //0
                memcpy(DST+OFST2+1,DST+OFST2+0,127);                                                                //   //0
                DST[OFST2+0]=distance;                                                                              //   //0
                TARG_S2[i03]=velo100; //socket velo target in percent                                               //   //0
                DST[OFST2+1]==0? //first note pressed after idle?                                                   //   //0
                (                                                                                                   //   //0
                  CTRL[OFST1+29]==3?(slider(41+i03*2)=velo100); //slider 29 is in 3 mode? >>jump vel ignoring porta //   //0
                  CTRL[OFST1+28]==3?FLAG00=0; //slider 29 is in 3 mode? >>set flag  ( was FLAG00=1, disabled 2026e) //   //0
                );                                                                                                  //   //0
                NOTEON=IN3;                                                                                          //   //0
              );                                                                                                    //   //0
                                                                                                                    //   //0
              DST[OFST2+0]!=0?  //if notes pressed exist?                                                           //   //0
              (                                                                                                     //   //0
                TARG_S1[i03]=100/RNG[i03]*(DST[OFST2+0]-1); //socket note pos target in % if notes pressed exist     //   //0
                FLAG00==1?(slider(40+i03*2)=TARG_S1[i03];FLAG00=0;); //flag set? >> jump pos ignoring porta          //   //0
              ):(                                                                                                    //   //0
                CTRL[OFST1+28]!=3?(TARG_S1[i03]=CTRL[OFST1+28]*50); //if slider28 mode is not "LAST", set 0? 50 or 100;  //0
                CTRL[OFST1+29]!=3?(TARG_S2[i03]=CTRL[OFST1+29]*50); //if slider29 mode is not "LAST", set 0? 50 or 100;  //0
              );                                                                                                     //   //0
                                                                                                                    //   //0
              CTRL[OFST1+25]<=1? //is socket mode = velo>>portamento?                                               //   //0
              (                                                                                                     //   //0
                DLT_S2[i03]=0; // NOT SURE ))))                                                                    //   //0
                slider(41+i03*2)=0;                                                                                 //   //0
                TARG_S2[i03]=0;                                                                                      //   //0
                velodlt=CTRL[OFST1+26]*(1-NOTEON/127)+CTRL[OFST1+27]*NOTEON/127;                                    //   //0
                CTRL[OFST1+25]==0?  // is mode time based?                                                          //   //0
                (                                                                                                   //   //0
                  DLT_S1[i03]=(TARG_S1[i03]-slider(40+i03*2))*1000/(srate*1.06^velodlt); //yes                      //   //0
                ):(                                                                                                 //   //0
                  DLT_S1[i03]=100*sign(TARG_S1[i03]-slider(40+i03*2))*1000/(srate*1.06^velodlt); // no, rate based  //   //0
                );                                                                                                  //   //0
              ):( //mode = dual                                                                                     //   //0
                CTRL[OFST1+25]==2?  // is mode time based?                                                          //   //0
                (                                                                                                   //   //0
                  DLT_S1[i03]=(TARG_S1[i03]-slider(40+i03*2))*1000/(srate*1.06^CTRL[OFST1+26]);                      //   //0
                  DLT_S2[i03]=(TARG_S2[i03]-slider(41+i03*2))*1000/(srate*1.06^CTRL[OFST1+27]);                      //   //0
                ):(      // no, rate based                                                                          //   //0
                  DLT_S1[i03]=100*sign(TARG_S1[i03]-slider(40+i03*2))*1000/(srate*1.06^CTRL[OFST1+26]);              //   //0
                  DLT_S2[i03]=100*sign(TARG_S2[i03]-slider(41+i03*2))*1000/(srate*1.06^CTRL[OFST1+27]);              //   //0                 
                );                                                                                                  //   //0
              );                                                                                                    //   //0
              CTRL[OFST1+24]==17?                                                                                   //   //0
              (                                                                                                     //   //0
                THR_BUF[i03]=(IN1*256+IN2)*256+IN3; //through no change                                             //   //0
              ):(                                                                                                   //   //0
                CTRL[OFST1+24]==16?                                                                                 //   //0
                (                                                                                                   //   //0
                  THR_BUF[i03]=((IN1*256+0)*256+IN3);  //through C-2                                                //   //0
                ):(                                                                                                 //   //0
                  CTRL[OFST1+24]==18?                                                                               //   //0
                  (                                                                                                 //   //0
                    THR_BUF[i03]=0;                                                                                 //   //0
                  ):(                                                                                               //   //0
                    THR_BUF[i03]=((((IN1&$xF0)+CTRL[OFST1+24])*256+IN2)*256+IN3);  //through change channel         //   //0
                  );                                                                                                //   //0
                );                                                                                                  //   //0
              );                                                                                                    //   //0
              through=0;                                                                                              //   //0
            );  //         "is in key zone" end                                                                     //   //0
  //  MIDI_MAIN_END =================================================================================  MIDI_MAIN_END //   //0
          );                                                                                                             //0
          i03 += 1;                                                                                                      //0
        ); //ROW_CICLE_END!!!!!!00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000//0           
      );   //"is note on or note off" end   
  
      through==1?
      (
      midisend(offset,IN1,IN2,IN3); //if NOT note on or note off then through
      ):(  
      i07=0;
        loop                                                                                                  
        (4,
          THR_BUF[i07]!=0?
          (
            midisend(0,(THR_BUF[i07]&$xFF0000)/$xFFFF,(THR_BUF[i07]&$x00FF00)/$xFF,THR_BUF[i07]&$x0000FF);//send THR_BUF
            i08=1;
            loop                                                                                                  
            (3-i07,
              THR_BUF[i07]==THR_BUF[i07+i08]?(THR_BUF[i07+i08]=0);//delete doubles
              i08 += 1;  
            );  
            THR_BUF[i07]=0;                                                                                     
          );
          i07 += 1;  
        );
      );  
      
  THR_BUF_0=THR_BUF[0];
  THR_BUF_1=THR_BUF[1];
  THR_BUF_2=THR_BUF[2];
  THR_BUF_3=THR_BUF[3];
  CTRL0=CTRL[0+24];
  CTRL1=CTRL[1+24];
  CTRL2=CTRL[2+24];
  CTRL3=CTRL[3+24];
  CTRL10=CTRL[0+24+16];
  CTRL11=CTRL[1+24+16];
  CTRL12=CTRL[2+24+16];
  CTRL13=CTRL[3+24+16];
  
    );
  );  
  // SOCKET processing part---------------------------------------------------------------------------- SOCKET processing part

  i05=0; //ROW_CICLE_START!!!!!!00000000000000000000000000000000000000000000000000000000000000
  loop //by section matrix rows
  (4,  

    slider(40+i05*2)!=TARG_S1[i05]?
    (
      temp00=slider(40+i05*2)+DLT_S1[i05];
      sign(TARG_S1[i05]-temp00)==sign(DLT_S1[i05])?
      (
        slider(40+i05*2)=temp00;
      ):(
        slider(40+i05*2)=TARG_S1[i05];
      );
      
    );  
  
    slider(41+i05*2)!=TARG_S2[i05]?
    (
      temp00=slider(41+i05*2)+DLT_S2[i05];
      sign(TARG_S2[i05]-temp00)==sign(DLT_S2[i05])?
      (
        slider(41+i05*2)=temp00;
      ):(
        slider(41+i05*2)=TARG_S2[i05];
      );
      
    );  
  
    i05 += 1; //ROW_CICLE_END!!!!!!000000000000000000000000000000000000000000000000000000000000
  );
  dev=20; // divider of sample rate;
);

@block

pst_old!=play_state ?
(
  i09=0;         //reset legato stack on stop/pause/play
  loop
  (512,  
    DST[i09]=0;
    i09 += 1;
  );
  pst_old=play_state;
);
 
@serialize

file_mem(0,CTRL,64);
file_mem(0,RNG,4);
file_mem(0,TARG_S1,4);
