- ベストアンサー
c言語での wavファイルの編集(音楽編集・フェード)
プログラミング初心者です。 現在Cでwavファイルの編集を行っています。 wavファイルにフェードをかけようと思うのですが、8bitの場合はうまくいったのですが、16ビットの場合がうまくいきません。 2バイト分読み込むだけでいいと思って、8ビットのときのf***(&data,1,***);のところの1を2にしただけです。 以下のようにプログラムを作成したのですがだめでした。 ヘッダの情報は決めうちでそのまま書き込むようにしてあります。 どのようにしたらうまくいきますか?? アドバイスよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define HEADER 44 // HEADER SIZE #define F_LEVEL 0.9999999 // FADE LEVEL double FADE(double f); main(int argc, char *argv[]) { FILE *f_in,*f_out; unsigned char header[HEADER]; unsigned char data2[2]; int data; double work,mul=1.0; if((f_in = fopen(argv[1],"rb")) == NULL) exit(0); if((f_out = fopen(argv[2],"wb")) == NULL) exit(0); fread(header,1,HEADER,f_in); // HEADER READ fwrite(header,1,HEADER,f_out); // HEADER WRITE while(fread(data2,2,1,f_in) == 1)<-ここのwhile内の部分 { をどうにかすればいいと思うのですが・・・ work = data2[0]+256U*data2[1]; mul = FADE(mul); work = work * mul; data = (int)(work); fwrite(&data,2,1,f_out); } data = 0; fwrite(&data,2,1,f_out); data = 0; fwrite(&data,2,1,f_out); fclose(f_in); fclose(f_out); } double FADE(double f)// FADE { f = f * F_LEVEL; return (f); } よろしくお願いします。 参考URL:http://www.kk.iij4u.or.jp/~kondo/wave/
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
16bit wavはデータが符号付です お示しのサイトにも # ビット数は 8bit と 16bit * 8bit ならば符号無し unsigned (0 ~ 255, 無音は 128) * 16bit ならば符号付き signed (-32768 ~ +32767, 無音は 0) と書かれています。 work = data2[0]+256U*data2[1]; の時点で値がおかしくなります(たとえば-1が65535と解釈されます) unsigned char data2[2]; を short data2; while(fread(data2,2,1,f_in) == 1) を while(fread(&data2,2,1,f_in) == 1) work = data2[0]+256U*data2[1]; を work = (double)data2; でどうでしょうか。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
>data = (int)(work); >fwrite(&data,2,1,f_out); ここがダメ。 データを取り出す時に >work = data2[0]+256U*data2[1]; とやってるなら、書き込む前も、上位バイトと下位バイトのどっちが先に来るか考えないと。 >data = (int)(work); >fwrite(&data,2,1,f_out); を data2[0]=work & 0xff; data2[1]=(work >> 8) & 0xff; fwrite(data2,2,1,f_out); にしよう。 因みに、 >data = (int)(work); >fwrite(&data,2,1,f_out); と書くと、実行環境によって動いたり動かなかったりする。
お礼
詳しいご説明、ご指摘ありがとうございました。 プログラムも無事に完成してうまく動作するようになりました。 本当に感謝いたします。 ありがとうございました。
お礼
詳しいご説明、ご指摘ありがとうございました。 プログラムも無事に完成してうまく動作するようになりました。 やはり、符号の部分が問題でおかしくなっていたようです。 本当に感謝いたします。 ありがとうございました。