 /* cc genwav4c.c -lm,  和音 */
#include <stdio.h>
#include <math.h>
/* 5 秒 */
#define SIZE  (4*44100*5)  
int cegL(unsigned char data[],int level,int from,int length);

int main() {
  FILE *fp2;
  char h[44]={0x52,0x49,0x46,0x46,  //RIFF
              0x84,0x56,0x8,0x0,        // ファイルのサイズ-8 ***
              0x57,0x41,0x56,0x45,  //WAVE
              0x66,0x6d,0x74,0x20,  //fmt 
              0x10,0x0,0x0,0x0,     // linear PCM
              0x1,0x0,              // linear PCM
              0x2,0x0,              // stereo
              0x44,0xac,0x0,0x0,    // sampling rate 0xac44=44100
              0x10,0xb1,0x2,0x0,    // byte per second, 44100*4
              0x4,0x0,              // 16 bit stereo
              0x10,0x0,             // bit/sample
              0x64,0x61,0x74,0x61,  // data
              0xb8,0x55,0x8,0x0};   // data部分のサイズ.
  unsigned char data[SIZE];
  int c;
  int i;
  int filesize = (44+SIZE)-8;
  int datasize = SIZE;
  fp2 = fopen("mysound.wav","w");
  /* ファイルサイズを自動計算 */
  h[4] = filesize % 0x100; h[5] = (filesize/0x100) % 0x100;
  h[6] = (filesize/0x10000) % 0x100; h[7] = (filesize/0x1000000) % 0x100;
  h[40] = datasize % 0x100; h[41] = (datasize/0x100) % 0x100;
  h[42] = (datasize/0x10000) % 0x100; h[43] = (datasize/0x1000000) % 0x100;

  /* set data in the array data */
  for (i=0; i<SIZE; i++) data[i]=0;
  cegL(data,2000,0,4*44100);  //0秒から4秒間, ドミソの和音

  for (i=0; i<44; i++) fputc(h[i],fp2);
  for (i=0; i<SIZE; i++) fputc(data[i],fp2);
  fclose(fp2);
}

int cegL(unsigned char data[],int level,int from,int length) {
  int i,p;
  int w;
  if (4*(from+length) >= SIZE) {
    fprintf(stderr,"Error\n"); return(-1);
  }
  for (i=from; i< from+length; i++) {
    /* 和音を作るには ドの周波数 523.25, ミの周波数 659.26, ソの周波数 783.99
       を重ねた sin 波を作れば良い.
    */
    w = (int) level*(sin(2*3.14*523.25*((double) i)/44100.0)
                    +sin(2*3.14*659.26*((double) i)/44100.0)
                    +sin(2*3.14*783.99*((double) i)/44100.0));
    p = i*4;
    /* printf("%d\n",w); */
    if (w < 0) w = w+0x10000;
    data[p] = w % 0x100;
    data[p+1] = w/0x100;
  }
  return(0);
} 

/*
  音階と周波数の関係を調べるには, [音階 周波数] 検索
*/

