バイナリwavファイルの中身をASCIIで見られるようにするプログラムと、その逆変換をするプログラム。
研修やってて思いついて書いた。
使い方
wav → ASCII
WavToAscii.exe "wavファイル名" "出力ASCIIファイル名"
ヘッダにちょっと説明をつけた形式で、waveファイルの中身をASCIIで書いてファイルに出力する。
ASCII → wav
AsciiToWav.exe "WavToAsciiで出力したのと同じ形式のファイル名" "出力wavファイル名"
第一引数には、WavToAscii.exeで出力したのと同じ形式でwavファイルの中身を書いたASCIIファイルを指定する。
これでwaveの音データを数値データで取り出して、MATLABとかでフィルタにかけて加工したり、重ね合わせて平井堅みたいに一人でハモったり、ずらして重ねて輪唱にしたり、あの声だけカットしてその場にいなかったことにしちゃったり、平井堅がたまに出すテンション高い曲にローパスフィルタかけてみたり、レジでバーコードを読む前に「ピッ」て口で言ったりすればいいじゃない。
//WavToAscii.c
//AsciiToWav.c
研修やってて思いついて書いた。
使い方
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; }