//******************** alt-tester as of Oct 25, 2013 ****************************** // alt-tester isn't full-fledged tuning software like alt-tuner, it's only for testing purposes // UNLIKE alt-tuner, alt-tester limits the tuning to either 11-EDO or 10-EDO // UNLIKE alt-tuner, it doesn't support the sustain pedal, pitch bend wheel or mod wheel // UNLIKE alt-tuner, it doesn't support holding down more than 2 keys at once in mono mode desc: tests keyboards, VSTi's and DAWs for use with alt-tuner (www.TallKite.com) in_pin:none out_pin:none slider1: 2 <1, 12, 1> pitch bend range (semitones) slider2: 0 <0, 6, 1{ multi-channel pitch bends (set the pitch bend range to match your synth), multi-channel pitch bends "safe" mode (same but requires 12 instances), single-channel pitch bends (for monophonic synths), sysex82 (for Xen-Arts synths among others), sysex88 (for Roland synths among others -- retuning is limited to -64¢ to +63¢), keyswitch (for Kontakt -- requires the microtonal keyswitch script), multi-channel RPN coarse/fine channel tuning (let me know if anything works with this!)}> tuning method slider3: 0 <0, 1, 1{ 11-EDO (11 equal steps to the octave with B = C), 10-EDO (10 equal steps to the octave with B = C and F = F#)}> tuning @init memset(24,-1,12);loop(12,i[0]=9*i+6;i+=1);cn=pn=-1;ch=24;nt=36;s82=48;s88=600;loop(12,j[i]=20*(i%6);i+=1);s82[0]=$x7F|0;s82[1]=$x00|0;s82[2]=$x08|0;s82[3]=$x02|0;s82[4]=$x00|0;s88[0]=$x7E|0;s88[1]=$x7F|0;s88[2]=$x08|0;s88[3]=$x08|0;s88[4]=$x03|0;s88[5]=$x7F|0;s88[6]=$x7F|0; @slider r=100*slider1;slider2>=3&&old<=2?cb=1;slider2!=3&&old==3?c2=1;slider2!=4&&old==4?c8=1;slider2!=5&&old==5?ck=1;slider2!=6&&old==6?cr=1;old=slider2;s=12*slider3; @block cb?(cb=i=0;loop(12,midisend(i,(224+i)|0,$x4000|0);i+=1));c2?(c2=0;s82[5]=127|0;memset(s82+6,0|0,508);i=0;loop(127,s82[4*i+6]=s82[4*i+7]=i|0;i+=1);midisyx(0,s82,514);i=j==1;s82[5]=1|0;s82[6]=s82[7]=127|0;midisyx(0,s82,10);i=j==1);c8?(c8=0;memset(s88+7,64|0,12);midisyx(0,s88,19);i=j==1);ck?(ck=i=0;loop(16,midisend(i,(144+i)|0,383|0);midisend(i+1,(144+i)|0,127|0);i+=1));cr?(cr=i=0;loop(12,j=(176+i)|0;midisend(i,j,101|0);midisend(i,j,612|0);midisend(i,j,16390|0);midisend(i,j,356|0);midisend(i,j,16390|0);midisend(i,j,38|0);midisend(i,j,32613|0);midisend(i,j,32612|0);i+=1));while(midirecv(o,i,db)?(m=i&240;c=i&15;n=db&$x7F;nc=n%12;j=(db/256)|0;no=m==144&&j>0;nf=m==144&&j==0;nf|=m==128;old==0&&(no||nf)?(ch[nc]==-1?(i=k=0;while(!k&&i<12?(j=0;while(ch[j]!=i&&j<12?j+=1);j==12?k=1:i+=1;1));ch[nc]=i);c=ch[nc];no?nt[nc]+=1:nt[nc]>0?nt[nc]-=1;nt[nc]==0?ch[nc]=-1;no?(i=8192+8192*(b[s+nc]-60)/r;i=min(max(i,0),16383);i=(i&$x7F)+256*((i/128)|0);midisend(o,(224+c)|0,i|0);o+=1));old==1&&(no||nf)?(c=nc;no?(i=8192+8192*(b[s+nc]-60)/r;i=min(max(i,0),16383);i=(i&$x7F)+256*((i/128)|0);midisend(o,(224+nc)|0,i|0);o+=1));old==2&&(no||nf)?(c=0;no?(pn=cn;cn=nc);nf?(nc==cn?cn=pn;pn=-1);cn!=-1?(i=8192+8192*(b[s+cn]-60)/r;i=min(max(i,0),16383);i=(i&$x7F)+256*((i/128)|0);midisend(o,(224+c)|0,i|0);o+=1));old==3&&no?(i=b[s+nc]-60;j=floor(i/100);i=(i-100*j)*1.28;k=(i-floor(i))*128;j+=n;j=min(max(j,0),127);j==127&&i==127?k=64;s82[5]=1|0;s82[6]=n|0;s82[7]=j|0;s82[8]=i|0;s82[9]=k|0;midisyx(o,s82,10);i=j==1;o+=1);old==4&&no?(i=0;loop(12,j=b[s+i]+4;j=min(max(j,0),127);s88[7+i]=j|0;i+=1);midisyx(o,s88,19);i=j==1;o+=1);old==5&&no?(i=8192+8192*(b[s+nc]-60)/50;t=floor(i/16384);i-=16384*t;j=(144+c)|0;n==0?(k=127;n=6):k=126;midisend(o,j,(k+256*n)|0);midisend(o+1,j,k|0);n=(db&$x7F)+t;n=min(max(0,n),127);n==0?(k=127;n=5):k=125;midisend(o,j,(k+256*n)|0);midisend(o+1,j,k|0);n=(i/128)|0;n==0?(k=127;n=4):k=124;midisend(o,j,(k+256*n)|0);midisend(o+1,j,k|0);n=(i&$x7F);n==0?(k=127;n=3):k=123;midisend(o,j,(k+256*n)|0);midisend(o+1,j,k|0);o+=1);old==6&&(no||nf)?(ch[nc]==-1?(i=k=0;while(!k&&i<12?(j=0;while(ch[j]!=i&&j<12?j+=1);j==12?k=1:i+=1;1));ch[nc]=i);c=ch[nc];no?nt[nc]+=1:nt[nc]>0?nt[nc]-=1;nt[nc]==0?ch[nc]=-1;no?(i=floor((b[s+nc]-60)/100);j=b[s+nc]-60-100*i;i+=64;i=min(max(i,0),127);j=8192+(8192*j/100)|0;j=min(max(j,0),16383);MSB=(j/128)|0;LSB=(j&$x7F)|0;j=(176+c)|0;midisend(o,j,101|0);midisend(o,j,612|0);midisend(o,j,(6+256*i)|0);o+=1;midisend(o,j,356|0);midisend(o,j,(6+256*MSB)|0);midisend(o,j,(38+256*LSB)|0);o+=1));midisend(o|0,(m+c)|0,db|0);1));