





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;
	
@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==$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=1; //slider 29 is in 3 mode? >>set flag                                  //   //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 SHURE ))))                                                                    //   //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;
);

@serialize

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