テキストデータの振幅値を書き込んでwavファイルを生成しようとしています.
しかし,書き込むファイルをバイナリモードで開いているのに,振幅値がバイナリで書き込まれません.
元となるwavデータから振幅値を取ってきてテキストファイルに書き込み,それをこのプログラムで読み取ってwavファイルを生成したのですが,元のような音にならず,バイナリエディタで確認したところ,元のwavファイルでは振幅値の部分は文字化けのように意味をなさない数字や記号が並ぶのですが,書き出したwavファイルでは振幅値の数字がそのままスペースで感覚を空けつつ並んでいます.そのような書き込みをするように書いたつもりはないのですが,どうしたら元のwavファイルと同様のものを生成できるようになりますか?
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define WAVOUT "wavFData.txt" 6 7typedef struct{ 8 char id[4]; 9 unsigned long size; 10 char form[4]; 11} riff_chunk; 12 13typedef struct{ 14 char id[4]; 15 unsigned long size; 16 unsigned short format_id; 17 unsigned short channel; 18 unsigned long fs; 19 unsigned long byte_sec; 20 unsigned short byte_samp; 21 unsigned short bit; 22} fmt_chunk; 23 24typedef struct 25{ 26 char id[4]; 27 unsigned long size; 28} data_chunk; 29 30 31riff_chunk riff; 32fmt_chunk fmt; 33data_chunk data; 34 35 36int main(){ 37 FILE *readfp; 38 FILE *writefp; 39 short fdata; 40 char filename[12]; 41 int sampleAmount; 42 43 readfp=fopen(WAVOUT,"r"); 44 if(readfp==NULL){ 45 printf("cannot open %s\n",WAVOUT); 46 exit(0); 47 } 48 49 sampleAmount=0; 50 while(fscanf(readfp,"%hd",&fdata)!=EOF) sampleAmount++; 51 52 printf("出力するwavファイル名を入力(拡張子は不要)\n"); 53 printf(">>"); 54 fscanf(stdin,"%12s",filename); 55 strcat(filename,".wav"); 56 writefp=fopen(filename,"wb"); 57 if(writefp==NULL){ 58 printf("cannot open %s\n",filename); 59 exit(0); 60 } 61 62 memcpy(riff.id,"RIFF",sizeof(riff.id)); 63 riff.size=sampleAmount*2+36; 64 memcpy(riff.form,"WAVE",sizeof(riff.form)); 65 66 memcpy(fmt.id,"fmt ",sizeof(fmt.id)); 67 fmt.size=16; 68 fmt.format_id=1; 69 fmt.channel=1; 70 fmt.fs=11025; 71 fmt.byte_sec=22050; 72 fmt.byte_samp=2; 73 fmt.bit=16; 74 75 memcpy(data.id,"data",sizeof(data.id)); 76 data.size=sampleAmount*2; 77 78 79 fwrite(riff.id,1,4,writefp); 80 fwrite(&riff.size,4,1,writefp); 81 fwrite(riff.form,1,4,writefp); 82 83 fwrite(fmt.id,1,4,writefp); 84 fwrite(&fmt.size,4,1,writefp); 85 fwrite(&fmt.format_id,2,1,writefp); 86 fwrite(&fmt.channel,2,1,writefp); 87 fwrite(&fmt.fs,4,1,writefp); 88 fwrite(&fmt.byte_sec,4,1,writefp); 89 fwrite(&fmt.byte_samp,2,1,writefp); 90 fwrite(&fmt.bit,2,1,writefp); 91 92 printf("size:%ld\n",riff.size); 93 printf("channel:%hd\n",fmt.channel); 94 printf("fs:%ld\n",fmt.fs); 95 printf("bit:%hd\n",fmt.bit); 96 97 fwrite(data.id,1,4,writefp); 98 fwrite(&data.size,4,1,writefp); 99 100 printf("sample:%ld\n",data.size); 101 printf("time:%ld\n",(data.size/2)/fmt.fs); 102 103 rewind(readfp); 104 for(int i=0;i<(data.size/2);i++){ 105 fread(&fdata,2,1,readfp); 106 fwrite(&fdata,2,1,writefp); 107 } 108 109 fclose(readfp); 110 fclose(writefp); 111}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/24 07:50
2019/08/24 07:54
退会済みユーザー
2019/08/24 08:06
2019/08/24 08:10
退会済みユーザー
2019/08/24 08:41