私はこのコードを使用して Delphi で .wav データを読み取り、結果を matlab 関数 wavread から取得した値と比較しています。そこから、matlab関数はどれがサンプルデータ値であるかを自動的に認識できると言えますが、delphiではそうではありません(ただし、matlabとdelphiのコード結果は同じです)。私の Delphi コードはサンプル データ値を認識できないため、配列を調べたところ、サンプル データ値の開始位置のインデックスが .wav ファイルごとに異なることがわかりました。例として、いくつかの .wav ファイルをテストして、これを取得します。
- classic1.wav wavedata[].Data[] インデックス番号 40 で始まるサンプル データ値
- classic2.wav wavedata[].Data[] インデックス番号 35 で始まるサンプル データ値
結果 y,[y, Fs, nbits, opts]=wavread('classic1.wav','double'); を見て結論を上回りました。次に、結果の Delphi の戻り値を配列で確認し、classic1.wav のインデックス 40 と classic2.wav のインデックス 35 で始まるまったく同じ値を見つけます。そして、各 .wav ファイルのサンプル データ値の開始インデックスを知る方法があるかどうか知りたいですか?
EDIT : 与えられた参照に似たレコードを修正しました。ヘッダー (ChunkID から Subchunk2size まで) は完全に正しいですが、前の結果から変更がないため、それに続くサンプル データにまだ混乱しています。
type
TWaveHeader = packed record
Marker_RIFF: array [0..3] of char;
ChunkSize: cardinal;
Marker_WAVE: array [0..3] of char;
Marker_fmt: array [0..3] of char;
SubChunkSize: cardinal;
FormatTag: word;
NumChannels: word;
SampleRate: longint;
ByteRate: longint;
BlockAlign:word;
BitsPerSample: word;
Marker_data: array [0..3] of char;
DataBytes: longint;
end;
TChannel = record
Data : array of smallint;
end;