Writing wave files to disk (Views: 28)
Problem/Question/Abstract: How do i write a wave file? Answer: type TPCMWaveHeader = record rID: array[0..3] of char; { 'RIFF' Identifier } rLen: longint; wID: array[0..3] of char; { 'WAVE' Identifier } fId: array[0..3] of char; { 'fmt ' Identifier } fLen: longint; { Fixed, must be 16 } wFormatTag: word; { Fixed, must be 1 } nChannels: word; { Mono=1, Stereo=2 } nSamplesPerSec: longint; { SampleRate in Hertz } nAvgBytesPerSec: longint; nBlockAlign: word; nBitsPerSample: word; { Resolution, e.g. 8 or 16 } dId: array[0..3] of char; { 'data' Identifier } dLen: longint; { Number of following data bytes } end; procedure WritePCMWaveFile(Filename: string; Resolution, Channels, Samplerate, Samples: integer; Data: Pointer); var h: TPCMWaveHeader; f: file; databytes: integer; begin DataBytes := Samples; DataBytes := DataBytes * Channels; { double if stereo } DataBytes := DataBytes * (Resolution div 8); { double if 16 Bit } FillChar(h, SizeOf(TPCMWaveHeader), #0); with h do begin rID[0] := 'R'; rID[1] := 'I'; rID[2] := 'F'; rID[3] := 'F'; { 1st identifier } rLen := DataBytes + 36; wID[0] := 'W'; wID[1] := 'A'; wID[2] := 'V'; wID[3] := 'E'; { 2nd identifier } fId[0] := 'f'; fId[1] := 'm'; fId[2] := 't'; fID[3] := Chr($20); { 3rdidentifier ends with a space character } fLen := $10; { Fixed, must be 16 } wFormatTag := 1; { Fixed, must be 1 } nChannels := Channels; { Channels } nSamplesPerSec := SampleRate; { Sample rate in Hertz } nAvgBytesPerSec := SampleRate * Channels * trunc(Resolution div 8); nBlockAlign := Channels * (Resolution div 8); { Byte order, see below } nBitsPerSample := Resolution; dId[0] := 'd'; dId[1] := 'a'; dId[2] := 't'; dId[3] := 'a'; { Data identifier } dLen := DataBytes; { number of following data bytes } end; AssignFile(f, filename); ReWrite(f, 1); BlockWrite(f, h, SizeOf(h)); BlockWrite(f, pbytearray(data), databytes); CloseFile(f); { The rest of the file is the wave data. Order is low-high for left channel, low-high for right channel, and so on. For mono or 8 bit files make the respective changes. } end; |