tone.c 1.0 KB

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