#include #include #include #define BASEFREQ 1024 typedef struct note NOTE; struct note { double phi; int age; double freq; double fade; double fadefactor; } ; static NOTE notes[4]; static int nint(double d) { if (d < 0) return(d-.5); else return(d+.5); } static void write_sample(int s) { if (s < -32767) s = -32767; if (s > 32767) s = 32767; putchar((s>>8)&0xff); putchar(s&0xff); } static void init_note(NOTE *n, int start, double freq, double fade) { n->phi = 0; n->age = -start; n->freq = freq; n->fade = 1; n->fadefactor = pow(.5,fade/5000); } static double note_value(NOTE *n) { n->age ++; n->phi += (n->freq*2*M_PI) / 8000; if (n->phi >= 2*M_PI) n->phi -= 2*M_PI; if (n->age < 0) { return(0); } else if (n->age < 200) { return(n->age*sin(n->phi)/200); } else { return(sin(n->phi)*(n->fade*=n->fadefactor)); } } int main(void); int main(void) { int i; /* some kind of fanfare? */ init_note(¬es[0],0,BASEFREQ,3); init_note(¬es[1],200,(3*BASEFREQ)/2,8); init_note(¬es[2],400,(5*BASEFREQ)/3,6); init_note(¬es[3],600,2*BASEFREQ,4); for (i=0;i<8000;i++) { write_sample(nint( ( note_value(¬es[0]) + note_value(¬es[1]) + note_value(¬es[2]) + note_value(¬es[3]) ) * 3000 )); } exit(0); }