/* 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
注意!ソースを読まずにむやみに実行しないでください。