改め Objective Technician

はぐれ技術者のやりたい放題

WAVE ⇔ ASCII 変換プログラム

2007-09-09 21:27:56 | プログラミング
バイナリwavファイルの中身をASCIIで見られるようにするプログラムと、その逆変換をするプログラム。

研修やってて思いついて書いた。


使い方

wav → ASCII

WavToAscii.exe "wavファイル名" "出力ASCIIファイル名"

ヘッダにちょっと説明をつけた形式で、waveファイルの中身をASCIIで書いてファイルに出力する。


ASCII → wav

AsciiToWav.exe "WavToAsciiで出力したのと同じ形式のファイル名" "出力wavファイル名"

第一引数には、WavToAscii.exeで出力したのと同じ形式でwavファイルの中身を書いたASCIIファイルを指定する。



これでwaveの音データを数値データで取り出して、MATLABとかでフィルタにかけて加工したり、重ね合わせて平井堅みたいに一人でハモったり、ずらして重ねて輪唱にしたり、あの声だけカットしてその場にいなかったことにしちゃったり、平井堅がたまに出すテンション高い曲にローパスフィルタかけてみたり、レジでバーコードを読む前に「ピッ」て口で言ったりすればいいじゃない。




//WavToAscii.c


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	FILE *wav, *ascii;
	char buffer[4];
	int ibuf;
	int byten;
	int bits;
	int data, i;

	if(argc != 3) {
		printf("プログラム名 WAVファイル名 出力ASCIIファイル名\n");
		exit(1);
	}


	if((sizeof(int) != 4) || (sizeof(short int) != 2)){
		printf("int が4バイト、short int が2バイトの環境で実行してください。\n");
		exit(1);
	}

	if((wav = fopen(argv[1], "rb")) == NULL) {
		printf("%sを開けません\n", argv[1]);
		exit(1);
	}

	if((ascii = fopen(argv[2], "w")) == NULL) {
		printf("%sを開けません\n", argv[2]);
		exit(1);
	}

	fread(buffer, 4, 1, wav);
	fprintf(ascii, "%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3]);

	fread(&ibuf, 4, 1, wav);
	fprintf(ascii, "ファイルサイズ: %d\n", ibuf);

	fread(buffer, 4, 1, wav);
	fprintf(ascii, "%c%c%c%c", buffer[0], buffer[1], buffer[2], buffer[3]);

	
	fread(buffer, 4, 1, wav);
	fprintf(ascii, "%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3]);

	
	fread(&ibuf, 4, 1, wav);
	fprintf(ascii, "バイト数: %d\n", ibuf);
	byten = ibuf;


	fread(&ibuf, 2, 1, wav);
	fprintf(ascii, "フォーマットID: %d\n", ibuf);

	fread(&ibuf, 2, 1, wav);
	fprintf(ascii, "チャネル数: %d\n", ibuf);

	fread(&ibuf, 4, 1, wav);
	fprintf(ascii, "サンプリングレート[Hz]: %d\n", ibuf);

	fread(&ibuf, 4, 1, wav);
	fprintf(ascii, "データ転送[Byte/sec]: %d\n", ibuf);

	fread(&ibuf, 2, 1, wav);
	fprintf(ascii, "ブロックサイズ[Byte/sample×チャネル数]: %d\n", ibuf);

	fread(&ibuf, 2, 1, wav);
	fprintf(ascii, "サンプルあたりのビット数[bit/sample]: %d\n", ibuf);
	bits = ibuf;


	if(byten != 16){
		fread(&ibuf, 2, 1, wav);
		fprintf(ascii, "%d\n", ibuf);

	}


	fread(buffer, 4, 1, wav);
	fprintf(ascii, "%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3]);

	fread(&data, 4, 1, wav);
	fprintf(ascii, "波形データバイト数: %lu\n", data);

	bits /= 8;

	data /= bits;

	i = 0;


	while(!feof(wav)) {
		if(ferror(wav)) {
			printf("wavファイルエラー\n");
			exit(1);
		}

		if(ferror(ascii)) {
			printf("asciiファイルエラー\n");
			exit(1);
		}

		fread(&byten, bits, 1, wav);

		fprintf(ascii, "%hd ", byten);

		printf("\b\b\b\b\b\b\b%d[%%]", (int)(100.0*(double)(i++)/(double)data));
	}

	fclose(wav);
	fclose(ascii);

	return 0;
}















//AsciiToWav.c


#include %lt;stdio.h>
#include %lt;stdlib.h>

int main(int argc, char *argv[])
{
	FILE *wav, *ascii;
	char buffer[4], charactor[80];
	int ibuf;
	int byten;
	int bits;
	short int si;
	int data, i;


	if(argc != 3) {
		printf("プログラム名 AsciiWAVファイル名 出力waveファイル名\n");
		exit(1);
	}


	if((sizeof(int) != 4) || (sizeof(short int) != 2)){
		printf("int が4バイト、short int が2バイトの環境で実行してください。\n");
		exit(1);
	}


	if((ascii = fopen(argv[1], "r")) == NULL) {
		printf("%sを開けません\n", argv[1]);
		exit(1);
	}

	if((wav = fopen(argv[2], "wb")) == NULL) {
		printf("%sを開けません\n", argv[2]);
		exit(1);
	}

	fscanf(ascii, "%c%c%c%c\n", &buffer[0], &buffer[1], &buffer[2], &buffer[3]);
	fwrite(buffer, 4, 1, wav);
	printf("%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3]);


	fscanf(ascii, " %s %d\n", charactor, &ibuf);
	fwrite(&ibuf, 4, 1, wav);
	printf("%s %d\n", charactor, ibuf);

	fscanf(ascii, "%c%c%c%c\n", &buffer[0], &buffer[1], &buffer[2], &buffer[3]);
	fwrite(buffer, 4, 1, wav);
	printf("%c%c%c%c", buffer[0], buffer[1], buffer[2], buffer[3]);

	fscanf(ascii, "%c%c%c%c\n", &buffer[0], &buffer[1], &buffer[2], &buffer[3]);
	fwrite(buffer, 4, 1, wav);
	printf("%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3]);

	
	fscanf(ascii, " %s %d\n", charactor, &ibuf);
	fwrite(&ibuf, 4, 1, wav);
	printf("%s %d\n", charactor, ibuf);
	byten = ibuf;

	fscanf(ascii, " %s %hd\n", charactor, &si);
	fwrite(&si, 2, 1, wav);
	printf("%s %hd\n", charactor, si);

	fscanf(ascii, " %s %hd\n", charactor, &si);
	fwrite(&si, 2, 1, wav);
	printf("%s %hd\n", charactor, si);

	fscanf(ascii, " %s %d\n", charactor, &ibuf);
	fwrite(&ibuf, 4, 1, wav);
	printf("%s %d\n", charactor, ibuf);

	fscanf(ascii, " %s %d\n", charactor, &ibuf);
	fwrite(&ibuf, 4, 1, wav);
	printf("%s %d\n", charactor, ibuf);

	fscanf(ascii, " %s %hd\n", charactor, &si);
	fwrite(&si, 2, 1, wav);
	printf("%s %hd\n", charactor, si);

	fscanf(ascii, " %s %hd\n", charactor, &si);
	fwrite(&si, 2, 1, wav);
	printf("%s %hd\n", charactor, si);
	bits = (int)si;


	if(byten != 16){
		fscanf(ascii, " %s %hd\n", charactor, &si);
		fwrite(&si, 2, 1, wav);
		printf("%s %hd\n", charactor, si);

	}


	fscanf(ascii, "%c%c%c%c\n", &buffer[0], &buffer[1], &buffer[2], &buffer[3]);
	fwrite(buffer, 4, 1, wav);
	printf("%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3]);
	

	fscanf(ascii, " %s %d\n", charactor, &ibuf);
	fwrite(&ibuf, 4, 1, wav);
	printf("%s %d\n", charactor, ibuf);
	data = ibuf;

	bits /= 8;

	data /= bits;

	i = 0;


	while(!feof(ascii)) {

		if(ferror(wav)) {
			printf("wavファイルエラー\n");
			exit(1);
		}

		if(ferror(ascii)) {
			printf("asciiファイルエラー\n");
			exit(1);
		}
		fflush(wav);

		fscanf(ascii, "%hd ", &si);

		fwrite(&si, bits, 1, wav);

		printf("\b\b\b\b\b\b\b%d[%%]", (int)(100.0*(double)(i++)/(double)data));
	}

	fclose(wav);
	fclose(ascii);

	return 0;
}