>>5548
BPM = 200;
hB=(t,T)=>t*[1,0.9,1,1.125,1.2,1.125,1.2,1.35,1.5,1.35,1.6,1.5,1.8,1.6,1.5,1.6,1.35,1.5,1.6,1.8,2,2.25,2.4,2.7,1.125,1.2,1.35,1.5,1.875,2,2.25,2.4][(T>>13)&31]*(1+(T>>18&1))*2,
B=(t,T)=>t*[1,1.2,1.35,1.5][(T>>16)&3]*(1+(T>>18&1))
function wG(type,m) {
switch (type) {
case 'sin':
return sin(m*PI/2)
break;
case 'squ':
return (m&2)-1
break;
case 'tri':
return abs(m/4%1-.5)*4-1
break;
case 'saw':
return (m/4%1)*2-1
break;
case 'rand':
return random()*2;
break;
case 'xor2':
return ((m*128^m*64)%256)/256;
case 'xor3':
return ((m*16*3^m*16)%256)/256;
case 'xor4':
return ((m*128^m*32)%256)/256;
case 'xor5':
return ((m*16*5^m*16)%256)/256;
case 'xor1_2':
return ((m*32^m*64)%256)/256;
case 'xor2_3':
return ((m*96^m*64)%256)/256;
case 'xor3_2':
return ((m*96^m*64)%256)/256;
case 'xor3_5':
return ((m*48^m*80)%256)/256;
case 'xor3_4':
return ((m*48^m*64)%256)/256;
case 'wavtabl1':
return (wave=[1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,1])[m&31]
case 'wavtabl2':
return (wave=[1,1,0,1,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1])[(m&wave.length)%wave.length]*2-1
case 'wavtabl3':
return 'blank'
}
}
return function (t,sR) {
mT=t*40960/48e3;
sT=mT*sR/150*BPM;
return wG('xor5',hB(mT,sT)*sR/64)/2+wG('xor2_3',B(mT,sT)*sR/64)*(sT>>13&1)-1
}