明辉站/网站教程/内容

生成一个波文件

网站教程2024-02-14 阅读
[摘要]Type TPCMWaveHeader = record rID : array[0..3] of char; 'RIFF' Identifier rLen : longint; wID : array[0..3] of char; 'WAVE&#...
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;

……

相关阅读