1#include <stdlib.h> 2#include <stdio.h> 3#include <math.h> 4#include <string.h> 5 6void usage(){ 7 fprintf(stderr,"tone <frequency_Hz>,[<amplitude>] [<frequency_Hz>,[<amplitude>]...]\n"); 8 exit(1); 9} 10 11int main (int argc,char *argv[]){ 12 int i,j; 13 double *f; 14 double *amp; 15 16 if(argc<2)usage(); 17 18 f=alloca(sizeof(*f)*(argc-1)); 19 amp=alloca(sizeof(*amp)*(argc-1)); 20 21 i=0; 22 while(argv[i+1]){ 23 char *pos=strchr(argv[i+1],','); 24 25 f[i]=atof(argv[i+1]); 26 if(pos) 27 amp[i]=atof(pos+1)*32767.f; 28 else 29 amp[i]=32767.f; 30 31 fprintf(stderr,"%g Hz, %g amp\n",f[i],amp[i]); 32 33 i++; 34 } 35 36 for(i=0;i<44100*10;i++){ 37 float val=0; 38 int ival; 39 for(j=0;j<argc-1;j++) 40 val+=amp[j]*sin(i/44100.f*f[j]*2*M_PI); 41 ival=rint(val); 42 43 if(ival>32767.f)ival=32767.f; 44 if(ival<-32768.f)ival=-32768.f; 45 46 fprintf(stdout,"%c%c%c%c", 47 (char)(ival&0xff), 48 (char)((ival>>8)&0xff), 49 (char)(ival&0xff), 50 (char)((ival>>8)&0xff)); 51 } 52 return(0); 53} 54 55