
プログラミング初心者です。
現在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/
No.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;
でどうでしょうか。
詳しいご説明、ご指摘ありがとうございました。
プログラムも無事に完成してうまく動作するようになりました。
やはり、符号の部分が問題でおかしくなっていたようです。
本当に感謝いたします。
ありがとうございました。
No.1
- 回答日時:
>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);
と書くと、実行環境によって動いたり動かなかったりする。
詳しいご説明、ご指摘ありがとうございました。
プログラムも無事に完成してうまく動作するようになりました。
本当に感謝いたします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 ファイル内のデータと入...
-
stable diffusionのエラー
-
【Excel VBA】10進数を2進数に...
-
'dataType' 引数を Null にする...
-
(C言語・配列)date[i]の分散...
-
int型(2バイト)データの分割
-
Cのプログラムがどうしても動き...
-
matlabのソースコードをpython...
-
iアプリ jamファイルの動的な出力
-
aliasesファイルを検索したいの...
-
printfの%eで指数部分の桁数を...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
:(コロン)のKeyCode
-
半角、全角の判別方法
-
C++ Builderで文字列をバイトに...
-
より高速な画像の表示法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
int型(2バイト)データの分割
-
CreateProcessでの環境変数の設...
-
【Excel VBA】10進数を2進数に...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
Excel VBA グラフ作成のとき...
-
ポインター引数の関数でコンパ...
-
C言語でのLinuxとwindows共通の...
-
C言語の構造体にてバブルソート...
-
sort関数でひらがなとカタカナ...
-
VisualBasicでレジストリキーの...
-
構造体のソートの方法について...
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
ActivePerlでSMTPプロトコルで...
-
POSTで配列のデータを渡す方法は?
-
min_elementの三番目の引数
-
c言語の多次元配列で1から100ま...
おすすめ情報