/*
 * creasuono.c
 * crea 7 secondi di suono con frequenza rapidamente variabile
 * 16 bit stereo 44.100Hz big-endian formato raw
 * in un file di nome assegnato
 *
 * Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale
 * Dipartimento di Matematica - Universita' di Pisa - AA 2004/2005
 * ultima modifica: 2005-05-22
 */

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

/* prototipi */

/* fine prototipi */

int main(argc,argv)
int argc;
char *argv[];

{
/* dichiarazioni */
  FILE *cdrout, *fopen();
  int i;
  short int ii; /* 2 bytes */
  char buf[256]; /* per la conversione little-endian big-endian */
  double f,t, ds,sn, pi2,freq;
  int wressize;
/* fine dichiarazioni */

pi2=8*atan(1.0); /* 2 pi greco */
freq=44100.0;
f=20.0;

if (argc != 2) {
                printf("usage: %s file.cdr \n",argv[0]);
                exit(EXIT_FAILURE);
                };

/* apri in scrittura il file.cdr */

if ((cdrout = fopen(argv[1],"w")) == NULL) {
	printf("\n non posso aprire il file  %s \n",argv[1]);
	exit(EXIT_FAILURE);
	};

/* 7 secondo di suono */
for(i=0;i<freq*7;i++) {
t=i/freq;

/* canale destro */
ds=sin(t*t*(1+sin(t*pi2))*pi2*f);
ds=ds*32767;
ii=ds;
/* scambio dei due bytes */
memcpy(buf,&ii,2);
wressize=fwrite(&buf[1],1,1,cdrout);
wressize=fwrite(buf,1,1,cdrout);

/* canale sinistro */
sn=sin(t*t*(1+cos(t*pi2))*pi2*f);
sn=sn*32767;
ii=sn;
/* scambio dei due bytes */
memcpy(buf,&ii,2);
wressize=fwrite(&buf[1],1,1,cdrout);
wressize=fwrite(buf,1,1,cdrout);

}

fclose(cdrout);
return EXIT_SUCCESS;
}
