#include <stdlib.h>
#include <stdio.h>
#include <math.h>
+#include <string.h>
void usage(){
- fprintf(stderr,"tone <frequency_Hz> [<amplitude>]\n");
+ fprintf(stderr,"tone <frequency_Hz>,[<amplitude>] [<frequency_Hz>,[<amplitude>]...]\n");
exit(1);
}
int main (int argc,char *argv[]){
- int i;
- double f;
- double amp=32767.;
+ int i,j;
+ double *f;
+ double *amp;
if(argc<2)usage();
- f=atof(argv[1]);
- if(argc>=3)amp=atof(argv[2])*32767.;
+
+ f=alloca(sizeof(*f)*(argc-1));
+ amp=alloca(sizeof(*amp)*(argc-1));
+
+ i=0;
+ while(argv[i+1]){
+ char *pos=strchr(argv[i+1],',');
+
+ f[i]=atof(argv[i+1]);
+ if(pos)
+ amp[i]=atof(pos+1)*32767.f;
+ else
+ amp[i]=32767.f;
+
+ fprintf(stderr,"%g Hz, %g amp\n",f[i],amp[i]);
+
+ i++;
+ }
for(i=0;i<44100*10;i++){
- long val=rint(amp*sin(i/44100.*f*2*M_PI));
- if(val>32767.)val=32767.;
- if(val<-32768.)val=-32768.;
+ float val=0;
+ int ival;
+ for(j=0;j<argc-1;j++)
+ val+=amp[j]*sin(i/44100.f*f[j]*2*M_PI);
+ ival=rint(val);
+
+ if(ival>32767.f)ival=32767.f;
+ if(ival<-32768.f)ival=-32768.f;
fprintf(stdout,"%c%c%c%c",
- (char)(val&0xff),
- (char)((val>>8)&0xff),
- (char)(val&0xff),
- (char)((val>>8)&0xff));
+ (char)(ival&0xff),
+ (char)((ival>>8)&0xff),
+ (char)(ival&0xff),
+ (char)((ival>>8)&0xff));
}
return(0);
}