バイナリ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;
}