小さな実験的な音楽作品として、標準 C で曲をプログラムしようとしています。コードは、Audacity にインポートできる生の PCM ファイルを出力します。現時点ではすべてが期待どおりに動作しますが、現在使用している 8 ビットではなく、各サンプルを 16 ビットとして書き込もうとすると問題が発生します。
書き込まれる時点まで、現在のサンプルは float として計算され、その境界はほぼ符号付き 8 ビット整数の範囲内に保たれます。次に、次のサンプルのプロセスを繰り返す前に、8 ビット整数として書き込まれます。これは正常に機能し、適切に再生されます。この問題は、16 ビットの生の PCM ファイルとして書き込もうとしたときに発生します。fwrite を使用して結果の 16 ビット整数を書き込むと、fwrite を使用して float を 256 倍し、結果を整数にコピーします。これは、インポート時に期待される結果をもたらさず、期待していたものの非常に歪んだバージョンになります。
問題は書き込み段階でのみ発生するため、以下に有効なコードを追加しました。
ワーキング 8 ビット コード:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
putc(out,fo);
16 ビット コードが機能しない:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
pcm=out*256;
fwrite(&pcm,2,1,fo);
明らかな何かが欠けているだけかもしれませんが、何時間もかけて解決しようとしています。前もって感謝します!