View difference between Paste ID: W1gCWyDz and 4uiT46tC
SHOW: | | - or go back to the newest paste.
1
type
2
  TRIFFHeader = packed record
3
    ID : array[0..3] of Char;
4
    Length: DWORD;
5
    WaveID: array[0..3] of Char;
6
  end;
7
  TFormatHeader = packed record
8
    ID : array[0..3] of Char;
9
    Length : DWORD;
10
    FormatTag : WORD;
11
    Channels : WORD;
12
    SamplesPerSec : DWORD;
13
    AvgBytesPerSec: DWORD;
14
    BlockAlign : WORD;
15
    BitsPerSample : WORD;
16
  end;
17
  TDataHeader = packed record
18
    ID : array[0..3] of Char;
19
    Length: DWORD;
20
  end;
21
  TWaveHeader = packed record
22
    RIFF: TRIFFHeader;
23
    Format: TFormatHeader;
24
    Data: TDataHeader;
25
  end;
26
  TWaveSample = packed record
27
    Left: Smallint;
28
    Right: Smallint;
29
  end;
30
  TWaveContent = Array of TWaveSample;
31
32
procedure SaveWAVEFile(WaveContent: TWaveContent; FileName: String);
33
var
34
  WaveHeader: TWaveHeader;
35
  FStream: TFileStream;
36
  WaveLength: Integer;
37
begin
38
  try
39
    FStream := TFileStream.Create(FileName, fmCreate);
40
    WaveLength := length(WaveContent);
41
42
    with WaveHeader do begin
43
      with RIFF do begin
44
        ID := 'RIFF';
45
        Length := 4 + WaveLength * 4 + SizeOf(TFormatHeader) + SizeOf(TDataHeader);
46
        WaveID := 'WAVE';
47
      end;
48
      with Format do begin
49
        ID := 'fmt ';
50
        Length := SizeOf(TFormatHeader)-8;
51
        FormatTag := $0001;
52
        Channels := 2;
53
        SamplesPerSec := 44100;
54
        AvgBytesPerSec := 176400;
55
        BlockAlign := 4;
56
        BitsPerSample := 16;
57
      end;
58
      with Data do begin
59
        ID := 'data';
60
        Length := WaveLength * 4;
61
      end;
62
    end;
63
64
    FStream.Write(WaveHeader, SizeOf(TWaveHeader));
65
    FStream.Write(WaveContent, 2048{WaveLength * 4});
66
  finally
67
    FStream.Free;
68
  end;
69
end;