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; |