Blame lib/tone.c

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