プログラミング初心者です。
現在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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
データの値の近いものをグルー...
-
【Excel VBA】10進数を2進数に...
-
10個の実数に対する降順ソート...
-
平滑化フィルタ
-
途中経過も表示するプログラム
-
'dataType' 引数を Null にする...
-
txtファイルを読み込んで表示関...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
stable diffusionのエラー
-
プロシージャ名の変数にカウン...
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
DataGridViewの特定列に入力さ...
-
10Mバイトて文字数に すると何...
-
Excel 1セル当りの文字数が2...
-
VB.NET LeftBの代用
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
データの値の近いものをグルー...
-
C言語 ファイル内のデータと入...
-
10個の実数に対する降順ソート...
-
C言語の構造体にてバブルソート...
-
'dataType' 引数を Null にする...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
c言語での wavファイルの編集(...
-
テキストファイルの結合について
-
C言語についてです! 同じ年の...
-
sort関数でひらがなとカタカナ...
-
matlabでのRRI検出
おすすめ情報