//  AF_MIDI_SCRIPT ver 03 ANDREW
//  11.03.16

slider1:0<-80,0,0.1> Input volume dB
slider2:3<0,3,1{OFF,ON,LEARN,EMPTY}>STATE MIDI Remote
slider3:0<0,1,1{ACTIVE_NOTES_SHUT_DOWN, ACTIVE_NOTES_RESTORED}>STATE NOTES
slider4:0<0,1,0.001>FAD POS (LINK_FROM_AF_SLAVE)
slider5:0.01<0.01,0.99,0.01>NOTES_SHUT_DOWN_FAD_POS
slider6:0.1<0.01,0.99,0.01>NOTES_RESTORE_FAD_POS
slider7:1<0,1,1{OFF,ON}>Lok STATE MIDI Remote

slider9:2<0.1,10,0.01>Tension to
slider10:1<0.1,10,0.001>CrosFadeTime to sec.

slider12:2<0.1,10,0.01>Tension from
slider13:1.5<0.1,10,0.001>CrosFadeTime from sec.

slider15:60<0,100,1>NOTES_RESTORE_LEVEL (%)

slider17:1<0,1,1{OFF,ON}>Lok link from & to

slider19:0<0,1,1>FX1
slider20:0<0,1,1>FX2
slider21:0<0,1,1>FX3
slider22:0<0,1,1>FX4
slider23:0<0,1,1>FX5
slider24:0<0,1,1>FX6
slider25:0<0,1,1>FX7
slider26:0<0,1,1>FX8
slider27:0<0,1,1>FX9
slider28:0<0,1,1>FX10
slider29:0<0,1,1>FX11
slider30:0<0,1,1>FX12


@init

NOTE=0; //NOTE[0...127] - input note state massive; 0 - off, 1...127 - in velo.
s4=slider4;

//MIDI_TRIGGER
midilisten=0;
asshole=1;//костыль для инициализации

@serialize //-----------------------------

file_var(0,MIDIBYTE1);
file_var(0,MIDIBYTE2);
file_var(0,MIDIBYTE3);
file_var(0,slider2);

cAmpDB = 8.65617025;

@slider

OFofst=floor(srate*slider4/1000);
ONofst=floor(srate*slider5/1000);

//MIDI_TRIGGER
s2pre!=slider2 && slider7 == 1 ?
(
	midilisten=0;
	slider2==3?
	(
		MIDIBYTE1=0;
		MIDIBYTE2=0;
		MIDIBYTE3=0;
	);

	slider2==2?(midilisten=1);

	(slider2<=1)&&(MIDIBYTE1==0)?
	(
		slider2=3;sliderchange(slider2);
	);

	s2pre=slider2;
);

outVol = exp(slider1/cAmpDB);

slider17 == 1 ?
(
slider12 = slider9;
slider13 = slider10;
):(
	slider13 >= slider10*2.5 ?
	(
		slider13 = slider10*2.5    // set no more *2.5 difference
	); sliderchange(slider13);
	slider13 <= slider10/2.5 ?
	(
		slider13 = slider10/2.5    // set no more *2.5 difference
	); sliderchange(slider13);
);

slider9 == 0 ?
(
	slider9 = 0.05;
);

slider12 == 0 ?
(
	slider12 = 0.05;
)

@sample
//MIDI_TRIGGER
asshole==1? //костыль для инициализации
(
	(slider2==2)&&(MIDIBYTE1==0)?(slider2=s2pre=3);
	(slider2==2)&&(MIDIBYTE1!=0)?(slider2=s2pre=0);
	asshole=0;
);


//-----------------------MIDI RECIEVE PART

while
(
  midirecv(offset,IN1,IN2,IN3)?
  (
    //MIDI_TRIGGER
    (midilisten==0)&&(slider2<=1)?
			(
				(MIDIBYTE1==IN1)&&(MIDIBYTE2==IN2)&&(MIDIBYTE3==IN3)?(slider2=1;sliderchange(slider2));
			);
		(midilisten==1)&&(IN1<=$xF0)?
		(
			MIDIBYTE1=IN1;
			MIDIBYTE2=IN2;
			MIDIBYTE3=IN3;
			slider2=1;sliderchange(slider2);
			midilisten=0;
		);
    ///////////////

    //Midi Note Section
    slider2<=1 ?
    (
    MID_TYP=IN1&$xF0;
    MID_CHN=IN1&$x0F;
    MID_NUM=IN2;
    MID_VAL=IN3;
    slider3!=0 ? midisend(0,IN1,IN2,IN3); // MIDI_THROUGH for the rest if controller 3 is active
    MID_TYP==$x90 ? NOTE[MID_NUM]=MID_VAL; //if noteon - record to massive
    MID_TYP==$x80 ? NOTE[MID_NUM]=0; //if noteoff - record 0 to massive
  );
  );
);

//-----------------------MIDI SEND PART


slider4<s4&&slider4<slider5&&slider3==1? //moving down, passed OFF point, not OFF yet?
(
	slider3=0; sliderchange(slider3);

	i0=0;loop
	(128,
		NOTE[i0]!=0 ? midisend(0 , $x90+CHAN , 0000+i0);
		i0+=1;
	);

	midisend(0,$xB0+CHAN,123); //all sounds off
	midisend(0,$xB0+CHAN,120); //all notes off
	midisend(0,$xB0+CHAN,64); //contr 64 off

);


slider4>s4&&slider4>slider6&&slider3==0? //moving up, passed on point, not ON yet?
(
  slider3=1; sliderchange(slider3);

  i1=0;loop
  (128,
		velocity=floor(NOTE[i1]*slider15*0.01); //velocity of restored notes
    velocity!=0 ? midisend(0 , $x90+CHAN , velocity*256+i1);
    i1+=1;
  );
);
s4=slider4;

spl0 = spl0*outVol;
spl1 = spl1*outVol;
