From 433a1b7339e2bf96f3b0bb4c98b8c799c6540027 Mon Sep 17 00:00:00 2001 From: jaybinks Date: Tue, 18 Sep 2007 13:19:20 +0000 Subject: changes in order to compile in lazarus... minor tidy ups and removal of big old comment blocks.. git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@394 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/Classes/URecord.pas | 117 ++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 67 deletions(-) (limited to 'Game/Code/Classes/URecord.pas') diff --git a/Game/Code/Classes/URecord.pas b/Game/Code/Classes/URecord.pas index 6ce83c0a..03c87a35 100644 --- a/Game/Code/Classes/URecord.pas +++ b/Game/Code/Classes/URecord.pas @@ -1,7 +1,13 @@ unit URecord; interface -uses Classes, Math, SysUtils, {DXSounds, Wave, }UMusic, UIni, BASS; + +uses Classes, + Math, + SysUtils, + UMusic, + UIni, + BASS; type TSound = class @@ -11,8 +17,6 @@ type Num: integer; n: integer; // length of Signal to analyze -// Spectrum: array[1..8192] of single; // sound buffer from above as FFT -// Spektogram: array[0..100] of TSpekt; // FFT(t) // pitch detection SzczytJest: boolean; // czy jest szczyt @@ -63,7 +67,7 @@ var Recording: TRecord; implementation -uses UMain, ULog; +uses UMain; procedure TSound.ProcessNewBuffer; var @@ -87,7 +91,8 @@ begin BufferNew.ReadBuffer(BufferArray[1+n-L], 2*L); // process BufferLong - if Ini.SavePlayback = 1 then begin + if Ini.SavePlayback = 1 then + begin BufferNew.Seek(0, soBeginning); BufferLong[0].CopyFrom(BufferNew, BufferNew.Size); end; @@ -110,32 +115,29 @@ var S: integer; // Signal Threshold: real; // threshold begin -// Log.LogAnalyze('[Analyze by Autocorrelation]'); SzczytJest := false; // find maximum volume of first 1024 words of signal MaxV := 0; - for S := 1 to 1024 do begin // 0.5.2: fix. was from 0 to 1023 -// Log.LogDebug('1'); -// Log.LogDebug(IntTostr(S)); + for S := 1 to 1024 do // 0.5.2: fix. was from 0 to 1023 + begin V := Abs(BufferArray[S]) / $10000; -// Log.LogDebug('2'); -// Log.LogDebug(IntTostr(S) + ': ' + FloatToStr(V) + ', MaxV='+floattostr(maxv)+', buf='+inttostr(length(BufferArray))); - if V > MaxV then MaxV := V; -// Log.LogDebug('3'); -// Log.LogDebug(IntTostr(S) + ': ' + FloatToStr(V) + ', MaxV='+floattostr(maxv)+', buf='+inttostr(length(BufferArray))); - end; + if V > MaxV then + MaxV := V; + end; // prepare to analyze MaxW := 0; // analyze all 12 halftones - for T := 0 to 35 do begin // to 11, then 23, now 35 (for Whitney and my high voice) + for T := 0 to 35 do // to 11, then 23, now 35 (for Whitney and my high voice) + begin F := 130.81*Power(1.05946309436, T)/2; // let's analyze below 130.81 Wages[T] := AnalyzeAutocorrelationFreq(F); - if Wages[T] > MaxW then begin // this frequency has better wage + if Wages[T] > MaxW then + begin // this frequency has better wage MaxW := Wages[T]; MaxT := T; end; @@ -149,20 +151,13 @@ begin 3: Threshold := 0.2; end; - //Log.LogDebug('Sound -> AnalyzeByAutocorrelation: MaxV='+floattostr(maxv)+', Threshold='+floattostr(threshold)); - if MaxV >= Threshold then begin // found acceptable volume // 0.1 + if MaxV >= Threshold then + begin // found acceptable volume // 0.1 SzczytJest := true; TonGamy := MaxT mod 12; Ton := MaxT mod 12; end; -// Log.LogAnalyze('--> Weight: ') -// Log.LogAnalyze('--> Selected: ' + BoolToStr(SzczytJest, true) + -// ', TonGamy: ' + IntToStr(Ton) + -// ', MaxV: ' + FloatToStr(MaxV)); -// Log.LogAnalyze(''); - - end; function TSound.AnalyzeAutocorrelationFreq(Freq: real): real; // result medium difference @@ -175,25 +170,14 @@ var begin // we use Signal as source Count := 0; - Il := 0; - Src := 1; - Move := Round(44100/Freq); - Dst := Src + Move; - - // ver 1 - sample 1 and compare n-times -{ while (Src <= Move) do begin // process by moving Src by one - while (Dst < n) do begin // process up to n (4KB) of Signal - Count := Count + Abs(Signal[Src] - Signal[Dst]) / $10000; - Inc(Dst, Move); - Inc(Il); - end; - - Inc(Src); - Dst := Src + Move; - end;} + Il := 0; + Src := 1; + Move := Round(44100/Freq); + Dst := Src + Move; // ver 2 - compare in vertical - while (Dst < n) do begin // process up to n (4KB) of Signal + while (Dst < n) do + begin // process up to n (4KB) of Signal Count := Count + Abs(BufferArray[Src] - BufferArray[Dst]) / $10000; Inc(Src); Inc(Dst); @@ -208,8 +192,6 @@ var L: integer; S: integer; PB: pbytearray; - PW: pwordarray; - SI: smallintarray; PSI: psmallintarray; I: integer; Skip: integer; @@ -217,8 +199,6 @@ var P2: integer; Boost: byte; begin -// Log.LogDebug('Record -> GetMicrophone: len='+inttstr(len)); - // set boost case Ini.MicBoost of 0: Boost := 1; @@ -230,7 +210,8 @@ begin // boost buffer L := Len div 2; // number of samples PSI := Buffer; - for S := 0 to L-1 do begin + for S := 0 to L-1 do + begin I := PSI^[S] * Boost; if I > 32767 then I := 32767; // 0.5.0: limit if I < -32768 then I := -32768; // 0.5.0: limit @@ -241,37 +222,36 @@ begin P1 := (user and 255) - 1; P2 := (user div 256) - 1; -// Log.LogDebug('Record -> GetMicrophone: P1='+inttostr(p1)+', P2='+inttostr(p2)); // 2 players USB mic, left channel - if P1 >= 0 then begin - L := Len div 4; // number of samples + if P1 >= 0 then + begin + L := Len div 4; // number of samples PB := Buffer; -// Log.LogDebug('Record -> GetMicrophone -> Sound[P1].BufferNew.Clear'); + Sound[P1].BufferNew.Clear; // 0.5.2: problem on exiting - for S := 1 to L do begin + for S := 1 to L do + begin Sound[P1].BufferNew.Write(PB[(S-1)*4], 2); end; Sound[P1].ProcessNewBuffer; end; // 2 players USB mic, right channel -// if Ini.Debug = 0 then Skip := 2 -// else Skip := 0; Skip := 2; - if P2 >= 0 then begin + if P2 >= 0 then + begin L := Len div 4; // number of samples PB := Buffer; Sound[P2].BufferNew.Clear; - for S := 1 to L do begin + for S := 1 to L do + begin Sound[P2].BufferNew.Write(PB[Skip + (S-1)*4], 2); end; Sound[P2].ProcessNewBuffer; end; -// Log.LogDebug('Record -> GetMicrophone -> Finish'); - Result := true; end; @@ -283,6 +263,7 @@ var InputName: PChar; Flags: integer; No: integer; + function isDuplicate(Desc: String): Boolean; var I: Integer; @@ -306,15 +287,17 @@ begin SC := 0; Descr := BASS_RecordGetDeviceDescription(SC); - while (Descr <> '') do begin + while (Descr <> '') do + begin //If there is another SoundCard with the Same ID, Search an available Name if (IsDuplicate(Descr)) then begin No:= 1; //Count of SoundCards with same Name Repeat - Inc(No) + Inc(No) Until not IsDuplicate(Descr + ' (' + InttoStr(No) + ')'); + //Set Description Descr := Descr + ' (' + InttoStr(No) + ')'; end; @@ -333,12 +316,12 @@ begin SoundCard[SC].Input[SCI].Name := InputName; // process each input - while (InputName <> nil) do begin + while (InputName <> nil) do + begin Flags := BASS_RecordGetInput(SCI); - if (SCI >= 1) {AND (Flags AND BASS_INPUT_OFF = 0)} then begin - + if (SCI >= 1) {AND (Flags AND BASS_INPUT_OFF = 0)} then + begin SetLength(SoundCard[SC].Input, SCI+1); - SoundCard[SC].Input[SCI].Name := InputName; end; @@ -346,18 +329,18 @@ begin if ((Flags and BASS_INPUT_TYPE_MIC) = 1) then SoundCard[SC].MicInput := SCI; - Inc(SCI); InputName := BASS_RecordGetInputName(SCI); end; - BASS_RecordFree; Inc(SC); Descr := BASS_RecordGetDeviceDescription(SC); end; // while end; + + end. -- cgit v1.2.3