>>11335
I have better instruments that I made for MIDI synthesis: https://old.reddit.com/r/bytebeat/comments/1vrigu2/synthesizing_instruments/
Integrated better instruments into midi player:
var BASE64_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var samples=[];
var freqmap=[];
var instrumentmap=[
0,1,1,0,0,0,0,0,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,
];
var instrumentfade=[-4,-4,-4,0,-4,0,];
var drumsamples=[13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,13,];
var drumpitches=[1,2,4,8,8,4,2,1,8,8,8,10,12,16,8,8,16,4,16,16,];
var drumfades=[9,10,11,12,8,7,6,5,9,11,13,7,7,6,5,3,4,10,12,9,];
//index 0-60 maps drums 27-87 to internal drums 0-19
var drummap=[1,3,18,9,9,3,10,8,0,0,3,2,17,2,7,8,6,9,5,11,5,4,13,4,12,16,16,18,15,19,14,12,15,10,9,10,1,0,2,1,17,9,18,10,18,13,18,16,18,9,17,2,1,10,8,18,13,12,10,0,1,];
function selectSample(inst,n){
switch(inst){
case 0: return [1,1,2,3,4,5,6,7,8][n<12?0:n>=96?8:n<36?((n-12)/6|0):((n+12)/12|0)];
case 1: return 0;
case 2: return 9;
case 3: return 10;
case 4: return 11;
case 5: return 12;
}
}
function generateSamples(){
for(var i=0;i<128;i++){
freqmap.push(8.25*pow(2,i/12|0)*pow(2,[0,13,28,42,55,71,84,100,113,127,142,155,][i%12]/171.));
}
var fN=15;
for(var ii=0;ii<fN;ii++){
s=[]; eg=[]; od=1; ev=1; ex=-1; ea=0; eb=0; vo=1; ep=(sqrt(5)-1)/2; efb=9; fft=1;
if(ii>=0&&ii<9){ //piano
eap=[4,5,6,7,8,10,12,14,16,]; ex=-1; ea=eap[ii]/-16.; efb=(ii<4?9:8);
}
else if(ii==9){ //guitar
ex=-1.5; eg=[7,2.5,1.5,]; efb=9;
}
else if(ii==10){ //square
fft=0; efb=10; for(var j=0;j<1<<efb;j++) s.push((j>>(efb-1))&1 ? -0.5 : 0.5);
}
else if(ii==11){ //percussive
ex=-2.75; eb=1; eg=[3.25,1,-2,]; efb=9;
}
else if(ii==12){ //organ
ex=-1.75; eg=[2.5,1.5,1,7.5,2,-1,]; efb=9;
}
else if(ii>=13&&ii<15){ //noise
fft=0; efb=11; r=1; s=new Float32Array(1<<efb); for(var j=0;j<1<<efb;j++) {s[j]=(((r&0xFFFF)-32768)/32768.); r^=r<<13; r^=r>>17; r^=r<<5;}
if(ii==14) {var t=new Float32Array(s); for(var j=0;j<1<<efb;j++) s[j]=(t[j]+t[(j+1)&((1<<efb)-1)]*-2+t[(j+2)&((1<<efb)-1)])*0.25;}
}
if(fft){
const fftbits = efb;
const fftsize = 1<<fftbits;
let fft1 = new Float32Array(fftsize);
let fft2 = new Float32Array(fftsize);
let tmp1 = new Float32Array(fftsize);
let tmp2 = new Float32Array(fftsize);
let costable = new Float32Array(fftsize);
for(i=0;i<fftsize;i++) costable[i]=cos(i*(2*PI)/fftsize)
let sintable = new Float32Array(fftsize);
for(i=0;i<fftsize;i++) sintable[i]=sin(i*(2*PI)/fftsize)
for(i=1;i<=fftsize/2;i+=1){ //harmonic magnitude adjustment
la=log2(i*2-1); lb=log2(i);
a=pow(2.,ea*floor(la)); b=pow(2.,eb*floor(lb)); //ea, eb - octave roll off
z=1; for(j=0;j<eg.length/3;j++) z*=exp(-exp(-pow((i-eg[j*3+0])/eg[j*3+1],2))*eg[j*3+2]); //eg - fine tuning with gaussian function
p=(i&1?od:ev); //od, ev - odd/even harmonic control
fft2[i]=a*b*pow(i,ex)*z*p*vo; //ex - uniform roll off
}
for(i=1;i<=fftsize/2;i++){ //harmonic phase adjustment
a=fft2[i]; j=i; b=ep*(j*j-1); //ep - harmonic phase shift
fft2[i]=a*cos(b*(2*PI)); fft1[i]=a*sin(b*(2*PI));
}
for(i=1;i<fftsize/2;i++){ //finish fft frequency symmetry
fft2[i]*=0.25; fft2[fftsize-i]+=-fft2[i]; fft1[i]*=0.25; fft1[fftsize-i]+=fft1[i];
}
let pass = fftsize;
let dist = 1;
for(let i=0; i<fftbits; ++i){
for(let counter=0; counter<dis