Fossil

Artifact [20c525ede3]
Login

Artifact [20c525ede3]

Artifact 20c525ede301b5bf5025cb451ba23a957ef68655df8dac990b4c06b7844f352a:


/*
** This C program was used to generate the "g-minor-triad.wav" file.
** A small modification generated the "b-flat.wav" file.
**
** This code is saved as an historical reference.  It is not part
** of Fossil.
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/*
** Write a four-byte little-endian integer value to out.
*/
void write_int4(FILE *out, unsigned int i){
  unsigned char z[4];
  z[0] = i&0xff;
  z[1] = (i>>8)&0xff;
  z[2] = (i>>16)&0xff;
  z[3] = (i>>24)&0xff;
  fwrite(z, 4, 1, out);
}

/*
** Write out the WAV file
*/
void write_wave(
  const char *zFilename,    /* The file to write */
  unsigned int nData,       /* Bytes of data */
  unsigned char *aData      /* 8000 samples/sec, 8 bit samples */
){
  const unsigned char aWavFmt[] = {
    0x57,  0x41,  0x56, 0x45,    /* "WAVE" */
    0x66,  0x6d,  0x74, 0x20,    /* "fmt " */
    0x10,  0x00,  0x00, 0x00,    /* 16 bytes in the "fmt " section */
    0x01,  0x00,                 /* FormatTag: WAVE_FORMAT_PCM */
    0x01,  0x00,                 /* 1 channel */
    0x40,  0x1f,  0x00, 0x00,    /* 8000 samples/second */
    0x40,  0x1f,  0x00, 0x00,    /* 8000 bytes/second */
    0x01,  0x00,                 /* Block alignment */
    0x08,  0x00,                 /* bits/sample */
    0x64,  0x61,  0x74, 0x61,    /* "data" */
  };
  FILE *out = fopen(zFilename,"wb");
  if( out==0 ){
    fprintf(stderr, "cannot open \"%s\" for writing\n", zFilename);
    exit(1);
  }
  fwrite("RIFF", 4, 1, out);
  write_int4(out, nData+4+20+8);
  fwrite(aWavFmt, sizeof(aWavFmt), 1, out);
  write_int4(out, nData);
  fwrite(aData, nData, 1, out);
  fclose(out);
}

int main(int argc, char **argv){
  int i = 0;
  unsigned char aBuf[800];
# define N      sizeof(aBuf)
# define pitch1 195.9977*2   /* G */
# define pitch2 233.0819*2   /* B-flat */
# define pitch3 293.6648*2   /* D */
  while( i<N/2 ){
    double v;
    v = 99.0*sin((2*M_PI*pitch3*i)/8000);
    if( i<200 ){
      v = v*i/200.0;
    }else if( i>N-200 ){
      v = v*(N-i)/200.0;
    }
    aBuf[i] = (char)(v+99.0);
    i++;
  }
  while( i<N ){
    double v;
    v = 99.0*sin((2*M_PI*pitch1*i)/8000);
    if( i<200 ){
      v = v*i/200.0;
    }else if( i>N-200 ){
      v = v*(N-i)/200.0;
    }
    aBuf[i] = (char)(v+99.0);
    i++;
  }
  write_wave("out.wav", N, aBuf);
  return 0;
}