/* makewave.c 鋸歯波 waveファイルを生成するプログラム
* デジタルオーディオテスト用に作成
*
* 1998 Copyright (c) NG Tech. lab
* All Rights Reserved.
*
* このプログラムはフリーソフトウェアとしますが、著作権は放棄していません。
* このプログラムを参考にして自分でプログラムを作ることを歓迎します。
*/
/* Win32コンソールアプリケーションとして作成しましたが、
* DOSアプリケーションとしてもコンパイルできると思います。
*/
#include <stdio.h>
#include <string.h>
/* このプログラムについて:
0000h 0001h 0002h 0003h ... fffeh,ffffh,0000h,0001h...
0000h,0100h,0200h,0300h,...ff00h,
という鋸歯波(というのかな?saw waveのことです)を繰り返し出力するプログラムです。
* 出力ファイル形式は16bits Stereo 44.1KHzのpcmのWindows wavファイルです。
* 0 〜0xffff 44.1KHz(44100サンプル/秒)
* 65536サンプル 1.49秒
*/
typedef unsigned char BYTE;
/*
* windows.hやmmsystem.hをincludeしてやれば、各種定義済み定数やmmio系の関数が
* 使えそうだが面倒なので、
*「16bits Stereo 44.1KHz PCM」でハードコーディングしている
*/
BYTE header[0x36]=
{
'R','I','F','F', //0000 RIFF
0x00, //0004
0x00, //0005
0x00, //0006
0x00, //0007
'W','A','V','E', //0008 WAVE
'f','m','t',' ', //000c 'fmt '
0x12, //0010
0x00, //0011
0x00, //0012
0x00, //0013
0x01, //0014
0x00, //0015
0x02, //0016
0x00, //0017
0x44, //0018
0xac, //0019
0x00, //001a
0x00, //001b
0x10, //001c
0xb1, //001d
0x02, //001e
0x00, //001f
0x04, //0020
0x00, //0021
0x10, //0022
0x00, //0023
0x4c, //0024
0x00, //0025
0x66, //0026
0x61, //0027
0x63, //0028
0x74, //0029
0x04, //002a
0x00, //002b
0x00, //002c
0x00, //002d
0x00, //002e
0x00, //002f
0x00, //0030
0x00, //0031
0x64,0x61,0x74,0x61 //0032
};
int main(void)
{
unsigned long head;//ヘッダサイズ
unsigned long r,l;
unsigned long sample;
unsigned long i;
char filename[80];
FILE *fp;
/* 書き込み用waveファイルをオープン */
//gets(filename);
strcpy(filename, "c:¥¥x.wav"); //ファイルネームを入力するのが面倒なので
fp = fopen(filename, "wb");
//sample = 0x1000000L; //サンプル数 16bitの左右4byteで1サンプルとする
sample = 0x10000L; //サンプル数 16bitの左右4byteで1サンプルとする
head = sample*4 + 50;
header[0x04] = (BYTE)(head & 0x000000ffL);
header[0x05] = (BYTE)(head & 0x0000ff00UL)/0x100UL;
header[0x06] = (BYTE)(head & 0x00ff0000UL)/0x10000UL;
header[0x07] = (BYTE)(head & 0xff000000UL)/0x1000000UL;
header[0x2e] = (BYTE)(sample & 0x000000ffL);
header[0x2f] = (BYTE)(sample & 0x0000ff00L)/0x100L;
header[0x30] = (BYTE)(sample & 0x00ff0000L)/0x10000L;
header[0x31] = (BYTE)(sample & 0xff000000L)/0x1000000L;
/* ヘッダ書き込み */
for(i = 0; i < 0x36; i++){
fprintf(fp, "%c", header[i]);
}
/* サンプル数書き込み */
fprintf(fp, "%c", ((sample*4) & 0xffL));
fprintf(fp, "%c", ((sample*4) & 0xff00L)/0x100);
fprintf(fp, "%c", ((sample*4) & 0xff0000L)/0x10000L);
fprintf(fp, "%c", ((sample*4) & 0xff000000L)/0x1000000L);
/* データ書き込み */
l = r = 0;
for(i = 0; i < sample; i++){
fprintf(fp, "%c", (l & 0xff00)/0x100);//左右とも同じ鋸歯波
fprintf(fp, "%c", l & 0x00ff); //周波数が低いからHI,LOを
fprintf(fp, "%c", (l & 0xff00)/0x100);//入れ換えちゃえ!
fprintf(fp, "%c", l & 0x00ff);
if(l == 0xffff)
l = 0;
else
l++;
r = l;
}
/* waveファイルをクローズ */
fclose(fp);
return 0;
}
/* makewave.c --------------------------- */
ダウンロードmakewave.exe
注意!ソースを読まずにむやみに実行しないでください。