00001 #include <stdlib.h>
00002 #include <stdio.h>
00003 #include <math.h>
00004 #include <string.h>
00005
00006 void usage(){
00007 fprintf(stderr,"tone <frequency_Hz>,[<amplitude>] [<frequency_Hz>,[<amplitude>]...]\n");
00008 exit(1);
00009 }
00010
00011 int main (int argc,char *argv[]){
00012 int i,j;
00013 double *f;
00014 double *amp;
00015
00016 if(argc<2)usage();
00017
00018 f=alloca(sizeof(*f)*(argc-1));
00019 amp=alloca(sizeof(*amp)*(argc-1));
00020
00021 i=0;
00022 while(argv[i+1]){
00023 char *pos=strchr(argv[i+1],',');
00024
00025 f[i]=atof(argv[i+1]);
00026 if(pos)
00027 amp[i]=atof(pos+1)*32767.f;
00028 else
00029 amp[i]=32767.f;
00030
00031 fprintf(stderr,"%g Hz, %g amp\n",f[i],amp[i]);
00032
00033 i++;
00034 }
00035
00036 for(i=0;i<44100*10;i++){
00037 float val=0;
00038 int ival;
00039 for(j=0;j<argc-1;j++)
00040 val+=amp[j]*sin(i/44100.f*f[j]*2*M_PI);
00041 ival=rint(val);
00042
00043 if(ival>32767.f)ival=32767.f;
00044 if(ival<-32768.f)ival=-32768.f;
00045
00046 fprintf(stdout,"%c%c%c%c",
00047 (char)(ival&0xff),
00048 (char)((ival>>8)&0xff),
00049 (char)(ival&0xff),
00050 (char)((ival>>8)&0xff));
00051 }
00052 return(0);
00053 }
00054