私はプログラミングに本当に慣れていないので、皆さんからの助けはとても役に立ち、とても感謝しています. ちなみにC++です。ヘッダーを正常に読み取った wave ファイルがあります。最初のウェーブ ファイルの 1 つおきのデータ値を出力として持つ別のウェーブ ファイルを作成したいと考えています。各値は、最初のファイルからの 2 つの平均になります。
これにより、サンプル数が半分になります。適切な速度で再生するには、サンプリング周波数が半分になるように、2 番目の wave ファイルのヘッダー情報を変更する必要があります。ただし、fwrite を使用しようとすると、算術演算ができないようです。最初のファイルと同じヘッダーを持つ 2 番目の wave ファイルの書き込みに成功しましたが、いくつかの値を変更する必要があります。
単純なデータ型が間違っているだけだと本当に思いますが、初心者のプログラマーなのでわかりません。
FILE* fptr2; // File pointer for WAV output
fptr2 = fopen("KingdomOut.wav","w"); // Open wav file for reading
int ChunkSizeOut = (HeaderInfo.ChunkSize)/2 + 18;
cout << ChunkSizeOut << endl;
// RIFF chunk descriptor
fwrite(HeaderInfo.ChunkID, sizeof(char), 4, fptr2); // "RIFF"
fwrite(&HeaderInfo.ChunkSize, sizeof(int), 1, fptr2); // 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
fwrite(HeaderInfo.Format, sizeof(char), 4, fptr2); // "WAVE"
// fmt sub-chunk
fwrite(HeaderInfo.Subchunk1ID, sizeof(char), 4, fptr2); // "fmt "
fwrite(&HeaderInfo.Subchunk1Size, sizeof(int), 1, fptr2); // bytes remaining in subchunk, 16 if uncompressed
fwrite(&HeaderInfo.AudioFormat, sizeof(short), 1, fptr2); // 1 = uncompressed
fwrite(&HeaderInfo.NumChannels, sizeof(short), 1, fptr2); // mono or stereo
fwrite(&HeaderInfo.SampleRate, sizeof(int), 1, fptr2);
fwrite(&HeaderInfo.ByteRate, sizeof(int), 1, fptr2); // == SampleRate * NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BlockAlign, sizeof(short), 1, fptr2); // == NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BitsPerSample, sizeof(short), 1, fptr2);
// data sub-chunk
fwrite(HeaderInfo.Subchunk2ID, sizeof(char), 4, fptr2); // "data"
fwrite(&HeaderInfo.Subchunk2Size, sizeof(int), 1, fptr2); // == NumSamples * NumChannels * BitsPerSample/8
fclose(fptr2);
これは、最初のデータを使用した 2 番目の wave ファイルの書き込みです。(最初の wav ファイルのヘッダーは、HeaderInfo という構造体にあります)。このコードは完全に機能しますが、&HeaderInfo.Chunksize を一番上にある値 ChunkSizeOut に変更したいと思います。int 型の変数は互換性がないと表示されているため、単純に値を入力することはできません。私はもっと多くのことを試しましたが、何もうまくいかないようです。&HeaderInfo.Chunksize で演算を実行しようとしましたが、それはできません。これ以外の変数も変更しますが、形式はすべて同じです。
私を助けてください、私はとても感謝しています。