2006. február 28., kedd

Writing wave files to disk


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;

Nincsenek megjegyzések:

Megjegyzés küldése