/* 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

注意!ソースを読まずにむやみに実行しないでください。


Sound Proデジタル入力波形考察ページに戻る<