Советы по Delphi. Версия 1.0.6 - страница 7
>
> {Записываем tag "fmt_"}
> WriteChunkName('fmt ');
> {Записываем ChunkSize}
> Ki.WAV.fmtSize:= 16; {должно быть 16-18}
> WriteChunkSize(Ki.WAV.fmtSize);
> {Записываем formatTag, nChannels}
> WriteChunkWord(Ki.WAV.formatTag);
> WriteChunkWord(Ki.WAV.nChannels);
> {Записываем nSamplesPerSec}
> WriteChunkSize(Ki.WAV.nSamplesPerSec);
> {Записываем nAvgBytesPerSec}
> WriteChunkSize(Ki.WAV.nAvgBytesPerSec);
> {Записываем nBlockAlign, nBitsPerSample}
> WriteChunkWord(Ki.WAV.nBlockAlign);
> WriteChunkWord(Ki.WAV.nBitsPerSample);
> {Записываем метку блока данных "data"}
> WriteChunkName('data');
> {Записываем DataSize}
> WriteChunkSize(Ki.WAV.DataSize);
> N:=0; {первая запись-позиция}
> while N<=Ki.Last do WriteOneDataBlock(Ki,Kj);{помещаем 4 байта и увеличиваем счетчик n}
> {Освобождаем буфер файла}
> CloseFile(OutFile);
>end; {WriteWAVFile}
>procedure InitSpecs;
>begin
>end; { InitSpecs }
>procedure InitSignals(var Kk : Observation);
>var J: Integer;
>begin
> for J:= 0 to MaxN do Kk.yyy[J]:= 0.0;
> Kk.MinO:= 0.0;
> Kk.MaxO:= 0.0;
> Kk.Last:= MaxN;
>end; {InitSignals}
>procedure InitAllSignals;
>begin
> InitSignals(K0R);
> InitSignals(K0B);
> InitSignals(K1R);
> InitSignals(K1B);
> InitSignals(K2R);
> InitSignals(K2B);
> InitSignals(K3R);
> InitSignals(K3B);
>end; {InitAllSignals}
>var chunkname: string[4];
>procedure ReadChunkName;
>var I : integer;
> MM : Byte;
>begin
> ChunkName[0]:= chr(4);
> for i := 1 to 4 do begin
> Read(InFile, MM);
> ChunkName[I]:=chr(MM);
> end;
>end; {ReadChunkName}
>procedure ReadChunkSize;
>var I: integer;
> MM : Byte;
>begin
> ChunkSize.x:= F0;
> ChunkSize.lint := 0;
> for i:= 0 to 3 do begin
> Read(InFile, MM);
> ChunkSize.chrs[I]:= MM;
> end;
> ChunkSize.x:= T1;
>end; {ReadChunkSize}
>procedure ReadOneDataBlock(var Ki,Kj:Observation);
>var I: Integer;
>begin
> if n<=maxn then begin
> ReadChunkSize; {получаем 4 байта данных}
> ChunkSize.x:=M1;
> with Ki.WAV do case nChannels of
> 1:
> if nBitsPerSample=16 then begin {1..2 Помещаем в буфер одноканальный 16-битный сэмпл}
> Ki.yyy[N]:=1.0*ChunkSize.up;
> if N
> N:= N+2;
> end else begin {1..4 Помещаем в буфер одноканальный 8-битный сэмпл}
> for I:=0 to 3 do Ki.yyy[N+I]:=1.0*ChunkSize.chrs[I];
> N := N+4;
> end;
> 2:
> if nBitsPerSample=16 then begin {2 Двухканальный 16-битный сэмпл}
> Ki.yyy[N]:=1.0*ChunkSize.dn;
> Kj.yyy[N]:=1.0*ChunkSize.up;
> N:= N+1;
> end else begin {4 Двухканальный 8-битный сэмпл}
> Ki.yyy[N]:=1.0*ChunkSize.chrs[1];
> Ki.yyy[N+1]:=1.0*ChunkSize.chrs[3];
> Kj.yyy[N]:=1.0*ChunkSize.chrs[0];
> Kj.yyy[N+1]:=1.0*ChunkSize.chrs[2];
> N:= N+2;
> end;
> end;
> if N<=MaxN then begin {LastN:= N;}
> Ki.Last:= N;
> if Ki.WAV.nChannels=2 then Kj.Last := N;
> end else begin {lastn := maxn;}
> Ki.Last:= MaxN;
> if Ki.WAV.nChannels=2 then Kj.Last := MaxN;
> end;
> end;
>end; {ReadOneDataBlock}
>procedure ReadWAVFile(var Ki, K : Observation);
>var MM: Byte;
> I: Integer;
> OK: Boolean;
> NoDataYet: Boolean;
> DataYet: Boolean;
> nDataBytes: LongInt;
>begin
> if FileExists(StandardInput)then with Ki.WAV do begin { Вызов диалога открытия файла }
> OK:= True; {если не изменится где-нибудь ниже}
> {Приготовления для чтения файла данных}
> AssignFile(InFile, StandardInput); { Файл, выбранный в диалоговом окне }
> Reset(InFile);
> {Считываем ChunkName "RIFF"}
> ReadChunkName;
> if ChunkName<>'RIFF' then OK:= False;
> {Считываем ChunkSize}
> ReadChunkSize;
> RIFFSize:= ChunkSize.lint; {должно быть 18,678}
> {Считываем ChunkName "WAVE"}
> ReadChunkName;
> if ChunkName<>'WAVE' then OK:= False;
> {Считываем ChunkName "fmt_"}
> ReadChunkName;
> if ChunkName<>'fmt ' then OK:= False;
> {Считываем ChunkSize}
> ReadChunkSize;
> fmtSize:= ChunkSize.lint; {должно быть 18}
> {Считываем formatTag, nChannels}
> ReadChunkSize;
> ChunkSize.x:= M1;
> formatTag:= ChunkSize.up;
> nChannels:= ChunkSize.dn;
> {Считываем nSamplesPerSec}
> ReadChunkSize;
> nSamplesPerSec := ChunkSize.lint;
> {Считываем nAvgBytesPerSec}
> ReadChunkSize;
> nAvgBytesPerSec:= ChunkSize.lint;
> {Считываем nBlockAlign}
> ChunkSize.x:= F0;
> ChunkSize.lint:= 0;
> for i:= 0 to 3 do begin
> Read(InFile, MM);
> ChunkSize.chrs[I]:= MM;