• tone.c
  • #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    void usage(){
      fprintf(stderr,"tone <frequency_Hz>,[<amplitude>] [<frequency_Hz>,[<amplitude>]...]\n");
      exit(1);
    }
    
    int main (int argc,char *argv[]){
      int i,j;
      double *f;
      double *amp;
    
      if(argc<2)usage();
    
      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++){
        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)(ival&0xff),
                (char)((ival>>8)&0xff),
                (char)(ival&0xff),
                (char)((ival>>8)&0xff));
      }
      return(0);
    }