アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング初心者です。
現在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/

A 回答 (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;
でどうでしょうか。
    • good
    • 0
この回答へのお礼

詳しいご説明、ご指摘ありがとうございました。
プログラムも無事に完成してうまく動作するようになりました。
やはり、符号の部分が問題でおかしくなっていたようです。
本当に感謝いたします。
ありがとうございました。

お礼日時:2006/11/08 10:14

>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);
と書くと、実行環境によって動いたり動かなかったりする。
    • good
    • 0
この回答へのお礼

詳しいご説明、ご指摘ありがとうございました。
プログラムも無事に完成してうまく動作するようになりました。
本当に感謝いたします。
ありがとうございました。

お礼日時:2006/11/08 10:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!