Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.0.6Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 4

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

 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;