View difference between Paste ID: TD3Sd8fP and W1gCWyDz
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;
70
71
function LoadWAVEFile(FileName: String): TWaveContent;
72
var
73
  WaveHeader: TWaveHeader;
74
  FStream: TFileStream;
75
  WaveLength: Integer;
76
begin
77
  try
78
    if FileExists(FileName) then begin
79
      FStream := TFileStream.Create(FileName,fmOpenRead);
80
      FStream.Read(WaveHeader,SizeOf(TWaveHeader)); // Den kompletten Header auslesen
81
      WaveLength := WaveHeader.Data.Length * 8 div (WaveHeader.Format.BitsPerSample
82
                    * WaveHeader.Format.Channels); // Länge des Arrays berechnen...
83
      SetLength(Result, WaveLength);
84
      FStream.Read(Result, WaveLength * 4);
85
      // Die Größe ist 4x so groß wie die Länge, weil 2 Channels * 2 Bytes / Sample
86
    end;
87
  finally
88
    FStream.Free
89
  end;
90
end;