nBlockAlign : LongInt(4);
DataSize : LongInt((MaxN+1)*2*2)
);
{================== Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ===================}
procedure ScaleData(var Kk : Observation);
var I : SampleIndex;
begin
{ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ}
Kk.MaxO:= Kk.yyy[0];
Kk.MinO:= Kk.yyy[0];
{Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ}
for I:= 1 to Kk.Last do begin
if kk.maxo < kk.yyy[i] then kk.maxo:= kk.yyy[i];
if kk.mino > kk.yyy[i] then kk.mino:= kk.yyy[i];
end;
end; { scaledata }
procedure ScaleAllData;
begin
ScaleData(K0R);
ScaleData(K0B);
ScaleData(K1R);
ScaleData(K1B);
ScaleData(K2R);
ScaleData(K2B);
ScaleData(K3R);
ScaleData(K3B);
end; {scalealldata}
{================== Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ WAV-Π΄Π°Π½Π½ΡΡ ===================}
VAR InFile, OutFile: file of Byte;
type Tag = (F0, T1, M1);
type FudgeNum = record
case X:Tag of
F0 : (chrs : array[0..3] of byte);
T1 : (lint : LongInt);
M1 : (up,dn: Integer);
end;
var ChunkSize : FudgeNum;
procedure WriteChunkName(Name: String);
var i: Integer;
MM: Byte;
begin
for i:= 1 to 4 do begin
MM:= ord(Name[i]);
write(OutFile, MM);
end;
end; {WriteChunkName}
procedure WriteChunkSize(LL:Longint);
var I: integer;
begin
ChunkSize.x:=T1;
ChunkSize.lint:=LL;
ChunkSize.x:=F0;
for I:= 0 to 3 do Write(OutFile,ChunkSize.chrs[I]);
end;
procedure WriteChunkWord(WW: Word);
var I: integer;
begin
ChunkSize.x:=T1;
ChunkSize.up:=WW;
ChunkSize.x:=M1;
for I:= 0 to 1 do Write(OutFile,ChunkSize.chrs[I]);
end; {WriteChunkWord}
procedure WriteOneDataBlock(var Ki, Kj : Observation);
var I: Integer
begin
ChunkSize.x:=M1;
with Ki.WAV do begin
case nChannels of
1:
if nBitsPerSample=16 then begin {1..2 ΠΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π² Π±ΡΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΊΠ°Π½Π°Π»ΡΠ½ΡΠΉ 16-Π±ΠΈΡΠ½ΡΠΉ ΡΡΠΌΠΏΠ»}
ChunkSize.up = trunc(Ki.yyy[N]+0.5);
if N<MaxN then ChunkSize.dn := trunc(Ki.yyy[N+1]+0.5);
N:= N+2;
end else begin {1..4 ΠΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π² Π±ΡΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΊΠ°Π½Π°Π»ΡΠ½ΡΠΉ 8-Π±ΠΈΡΠ½ΡΠΉ ΡΡΠΌΠΏΠ»}
for I:=0 to 3 do ChunkSize.chrs[I]:= trunc(Ki.yyy[N+I]+0.5);
N:= N+4;
end;
2:
if nBitsPerSample=16 then begin {2 ΠΠ²ΡΡ ΠΊΠ°Π½Π°Π»ΡΠ½ΡΠΉ 16-Π±ΠΈΡΠ½ΡΠΉ ΡΡΠΌΠΏΠ»}
ChunkSize.dn:= trunc(Ki.yyy[N]+0.5);
ChunkSize.up := trunc(Kj.yyy[N]+0.5);
N:= N+1;
end else begin {4 ΠΠ²ΡΡ ΠΊΠ°Π½Π°Π»ΡΠ½ΡΠΉ 8-Π±ΠΈΡΠ½ΡΠΉ ΡΡΠΌΠΏΠ»}
ChunkSize.chrs[1]:= trunc(Ki.yyy[N]+0.5);
ChunkSize.chrs[3]:= trunc(Ki.yyy[N+1]+0.5);
ChunkSize.chrs[0]:= trunc(Kj.yyy[N]+0.5);
ChunkSize.chrs[2]:= trunc(Kj.yyy[N+1]+0.5);
N:= N+2;
end;
end; {with wav do begin..}
end; {ΡΠ΅ΡΡΡΠ΅Ρ Π±Π°ΠΉΡΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ "chunksize" ΡΠ΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°}
ChunkSize.x:=T1;
WriteChunkSize(ChunkSize.lint);{ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ 4 Π±Π°ΠΉΡΠ° Π΄Π°Π½Π½ΡΡ }
end; {WriteOneDataBlock}
procedure WriteWAVFile(var Ki, Kj : Observation);
var MM: Byte;
I: Integer;
OK: Boolean;
begin
{ΠΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠ°ΠΉΠ»Π° Π΄Π°Π½Π½ΡΡ }
AssignFile(OutFile, StandardOutput); { Π€Π°ΠΉΠ», Π²ΡΠ±ΡΠ°Π½Π½ΡΠΉ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ }
ReWrite(OutFile);
With ki.wav do begin
DataSize:= nChannels*(nBitsPerSample div 8)*(Ki.Last+1);
RIFFSize:= DataSize+36;
fmtSize:= 16;
end;
{ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ChunkName "RIFF"}
WriteChunkName('RIFF');
{ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ChunkSize}
WriteChunkSize(Ki.WAV.RIFFSize);
{ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ChunkName "WAVE"}
WriteChunkName('WAVE');
{ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ 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<MaxN then Ki.yyy[N+1]:=1.0*ChunkSize.dn;
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;
end;
ChunkSize.x:= M1;