57 int findnote(
int chn,
int key)
63 if (notes[i].chn==chn && notes[i].key==key && notes[i].vel!=0)
return i;
73 for (
int i=0;i<128;i++)
75 float f = pow( 2. , (
float(i) - 69. ) / 12. ) * 440.;
76 dphase[i] = (M_PI*2.)*f / 44100.;
78 file = fopen(
"output.raw",
"wb");
86 void setnote(
int chn,
int key,
int vel)
91 int i = findnote(chn,key);
98 notes[nnotes].chn = chn;
99 notes[nnotes].key = key;
100 notes[nnotes].vel = vel;
101 notes[nnotes].phase = 0;
102 notes[nnotes].env = 0;
103 notes[nnotes].amp = float(vel)/128.;
107 void synthesize(
void)
110 for (
int j=0;j<44;j++)
115 for (i=0;i<nnotes;i++)
119 if (notes[i].env<1.) notes[i].env+=0.002;
121 if (notes[i].env>0.) notes[i].env-=0.001;
125 out += sin(notes[i].phase+sin(notes[i].phase)*2.)
126 *notes[i].env*notes[i].amp;
128 notes[i].phase += dphase[notes[i].key];
129 if (notes[i].phase>2.*M_PI) notes[i].phase -= 2.*M_PI;
135 if (notes[i].vel==0 && notes[i].env<0.001)
138 notes[i] = notes[nnotes];
144 buf[j] = (short)(out*2000.);
146 fwrite(buf,2,44,file);
153 Reader r(argc>1 ? argv[1] :
"test.mid");
160 fprintf(stderr,
"song has %d tracks\n",s.
Tracks());
175 fprintf(stderr,
"%d %d %d %02x %02x %02x\n",
183 if ((ev[0] & 0xF0)==0x90 || (ev[0] & 0xF0)==0x80)
192 synth.setnote(ev[0]&0x0F, ev[1], (ev[0] & 0xF0)==0x90 ? ev[2] : 0);
197 for (
int k=0;k<1000;k++) synth.synthesize();