aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrunzelchen <brunzelchen@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-10-08 16:04:14 +0000
committerbrunzelchen <brunzelchen@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-10-08 16:04:14 +0000
commitc4f1b4f542dc44b00e2a49ae8ab097130e0c050a (patch)
treede6214fda2d6d63414dae35f463e6767ac943689
parentbe55a113373cbd5eea229ed9d78bc1de5ed93069 (diff)
downloadusdx-c4f1b4f542dc44b00e2a49ae8ab097130e0c050a.tar.gz
usdx-c4f1b4f542dc44b00e2a49ae8ab097130e0c050a.tar.xz
usdx-c4f1b4f542dc44b00e2a49ae8ab097130e0c050a.zip
- ultrastar should detect on every single beat now
- new option: mic delay (between screen/music and tone detection) git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/1.0.1 Challenge MOD@2640 b956fd51-792f-4845-bead-9b4dfca2ff2c
-rw-r--r--Game/Code/Classes/UIni.pas12
-rw-r--r--Game/Code/Classes/UMain.pas495
-rw-r--r--Game/Code/Classes/UThemes.pas2
-rw-r--r--Game/Code/Screens/UScreenOptionsSound.pas14
-rw-r--r--Game/Output/Languages/Dutch.ini3
-rw-r--r--Game/Output/Languages/English.ini5
-rw-r--r--Game/Output/Languages/German.ini5
-rw-r--r--Game/Output/Languages/Italian.ini1
-rw-r--r--Game/Output/Languages/Languages.xlsbin211968 -> 212480 bytes
-rw-r--r--Game/Output/Themes/Blue Sensation.ini22
-rw-r--r--Game/Output/Themes/Deluxe.ini22
-rw-r--r--Game/Output/Themes/iStar.ini22
12 files changed, 340 insertions, 263 deletions
diff --git a/Game/Code/Classes/UIni.pas b/Game/Code/Classes/UIni.pas
index 682016b8..66bfba26 100644
--- a/Game/Code/Classes/UIni.pas
+++ b/Game/Code/Classes/UIni.pas
@@ -51,6 +51,7 @@ type
BeatClick: integer;
SavePlayback: integer;
Threshold: integer;
+ Delay: integer;
//Song Preview
PreviewVolume: integer;
@@ -168,6 +169,8 @@ const
IBeatClick: array[0..1] of string = ('Off', 'On');
ISavePlayback: array[0..1] of string = ('Off', 'On');
IThreshold: array[0..3] of string = ('5%', '10%', '15%', '20%');
+ IDelay: array[0..9] of string = ('0ms', '10ms', '20ms', '30ms', '40ms', '50ms', '60ms', '70ms', '80ms', '90ms');
+
//Song Preview
IPreviewVolume: array[0..10] of string = ('Off', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%');
IPreviewFading: array[0..5] of string = ('Off', '1 Sec', '2 Secs', '3 Secs', '4 Secs', '5 Secs');
@@ -434,6 +437,11 @@ begin
for Pet := 0 to High(IThreshold) do
if Tekst = IThreshold[Pet] then Ini.Threshold := Pet;
+ // Delay
+ Tekst := IniFile.ReadString('Sound', 'Delay', IDelay[5]);
+ for Pet := 0 to High(IDelay) do
+ if Tekst = IDelay[Pet] then Ini.Delay := Pet;
+
//Song Preview
Tekst := IniFile.ReadString('Sound', 'PreviewVolume', IPreviewVolume[7]);
for Pet := 0 to High(IPreviewVolume) do
@@ -791,6 +799,10 @@ begin
Tekst := IThreshold[Ini.Threshold];
IniFile.WriteString('Sound', 'Threshold', Tekst);
+ // Delay
+ Tekst := IDelay[Ini.Delay];
+ IniFile.WriteString('Sound', 'Delay', Tekst);
+
// Song Preview
Tekst := IPreviewVolume[Ini.PreviewVolume];
IniFile.WriteString('Sound', 'PreviewVolume', Tekst);
diff --git a/Game/Code/Classes/UMain.pas b/Game/Code/Classes/UMain.pas
index ecbc9c59..9b472528 100644
--- a/Game/Code/Classes/UMain.pas
+++ b/Game/Code/Classes/UMain.pas
@@ -56,7 +56,7 @@ type
Nuta: array of record
Start: integer;
Dlugosc: integer;
- Detekt: real; // dokladne miejsce, w ktorym wykryto ta nute
+ //Detekt: real; // dokladne miejsce, w ktorym wykryto ta nute
Ton: real;
Perfect: boolean; // true if the note matches the original one, lit the star
@@ -259,21 +259,25 @@ procedure GetMidBeatSub(BPMNum: integer; var Time: real; var CurBeat: real);
var
NewTime: real;
begin
- if High(AktSong.BPM) = BPMNum then begin
+ if High(AktSong.BPM) = BPMNum then
+ begin
// last BPM
CurBeat := AktSong.BPM[BPMNum].StartBeat + GetBeats(AktSong.BPM[BPMNum].BPM, Time);
Time := 0;
- end else begin
+ end else
+ begin
// not last BPM
// count how much time is it for start of the new BPM and store it in NewTime
NewTime := GetTimeForBeats(AktSong.BPM[BPMNum].BPM, AktSong.BPM[BPMNum+1].StartBeat - AktSong.BPM[BPMNum].StartBeat);
// compare it to remaining time
- if (Time - NewTime) > 0 then begin
+ if (Time - NewTime) > 0 then
+ begin
// there is still remaining time
CurBeat := AktSong.BPM[BPMNum].StartBeat;
Time := Time - NewTime;
- end else begin
+ end else
+ begin
// there is no remaining time
CurBeat := AktSong.BPM[BPMNum].StartBeat + GetBeats(AktSong.BPM[BPMNum].BPM, Time);
Time := 0;
@@ -285,37 +289,19 @@ function GetMidBeat(Time: real): real;
var
CurBeat: real;
CurBPM: integer;
-// TopBeat: real;
-// TempBeat: real;
-// TempTime: real;
+
begin
Result := 0;
if Length(AktSong.BPM) = 1 then Result := Time * AktSong.BPM[0].BPM / 60;
- (* 2 BPMs *)
-{ if Length(AktSong.BPM) > 1 then begin
- (* new system *)
- CurBeat := 0;
- TopBeat := GetBeats(AktSong.BPM[0].BPM, Time);
- if TopBeat > AktSong.BPM[1].StartBeat then begin
- // analyze second BPM
- Time := Time - GetTimeForBeats(AktSong.BPM[0].BPM, AktSong.BPM[1].StartBeat - CurBeat);
- CurBeat := AktSong.BPM[1].StartBeat;
- TopBeat := GetBeats(AktSong.BPM[1].BPM, Time);
- Result := CurBeat + TopBeat;
-
- end else begin
- (* pierwszy przedzial *)
- Result := TopBeat;
- end;
- end; // if}
-
(* more BPMs *)
- if Length(AktSong.BPM) > 1 then begin
+ if Length(AktSong.BPM) > 1 then
+ begin
CurBeat := 0;
CurBPM := 0;
- while (Time > 0) do begin
+ while (Time > 0) do
+ begin
GetMidBeatSub(CurBPM, Time, CurBeat);
Inc(CurBPM);
end;
@@ -332,26 +318,25 @@ begin
if Length(AktSong.BPM) = 1 then Result := AktSong.GAP / 1000 + Beat * 60 / AktSong.BPM[0].BPM;
(* more BPMs *)
- if Length(AktSong.BPM) > 1 then begin
+ if Length(AktSong.BPM) > 1 then
+ begin
Result := AktSong.GAP / 1000;
CurBPM := 0;
- while (CurBPM <= High(AktSong.BPM)) and (Beat > AktSong.BPM[CurBPM].StartBeat) do begin
- if (CurBPM < High(AktSong.BPM)) and (Beat >= AktSong.BPM[CurBPM+1].StartBeat) then begin
+ while (CurBPM <= High(AktSong.BPM)) and (Beat > AktSong.BPM[CurBPM].StartBeat) do
+ begin
+ if (CurBPM < High(AktSong.BPM)) and (Beat >= AktSong.BPM[CurBPM+1].StartBeat) then
+ begin
// full range
Result := Result + (60 / AktSong.BPM[CurBPM].BPM) * (AktSong.BPM[CurBPM+1].StartBeat - AktSong.BPM[CurBPM].StartBeat);
end;
- if (CurBPM = High(AktSong.BPM)) or (Beat < AktSong.BPM[CurBPM+1].StartBeat) then begin
+ if (CurBPM = High(AktSong.BPM)) or (Beat < AktSong.BPM[CurBPM+1].StartBeat) then
+ begin
// in the middle
Result := Result + (60 / AktSong.BPM[CurBPM].BPM) * (Beat - AktSong.BPM[CurBPM].StartBeat);
end;
Inc(CurBPM);
end;
-
-{ while (Time > 0) do begin
- GetMidBeatSub(CurBPM, Time, CurBeat);
- Inc(CurBPM);
- end;}
end; // if}
end;
@@ -375,7 +360,7 @@ begin
Czas.AktBeatC := Floor(Czas.MidBeatC);
Czas.OldBeatD := Czas.AktBeatD;
- Czas.MidBeatD := -0.5+GetMidBeat(Czas.Teraz - (AktSong.Gap + 120 + 20) / 1000); // MidBeat with addition GAP
+ Czas.MidBeatD := -0.5+GetMidBeat(Czas.Teraz - (AktSong.Gap + 120 + Ini.Delay*10) / 1000); // MidBeat with addition GAP
Czas.AktBeatD := Floor(Czas.MidBeatD);
Czas.FracBeatD := Frac(Czas.MidBeatD);
@@ -493,10 +478,11 @@ begin
for Pet := 0 to Czesci[CP].Czesc[Czesci[CP].Akt].HighNut do
begin
- if (Czesci[CP].Czesc[Czesci[CP].Akt].Nuta[Pet].Start = Czas.AktBeat) then
+ if (Czesci[CP].Czesc[Czesci[CP].Akt].Nuta[Pet].Start <= Czas.AktBeat) and
+ (Sender.LyricMain[CP].Selected <> Pet) then
begin
// operates on currently beated note
- Sender.LyricMain[CP].Selected := Pet
+ Sender.LyricMain[CP].Selected := Pet;
end;
end;
end;
@@ -560,12 +546,18 @@ var
SMin: integer;
SMax: integer;
SDet: integer; // temporary: sentence of detected note
+ BRange: integer; // beat range
+
+ AktTon: integer;
+
Pet: integer;
Mozna: boolean;
Nowa: boolean;
Range: integer;
NoteHit:boolean;
begin
+ SDet := 0;
+
for CP := 0 to PlayersPlay-1 do
begin
if (not AktSong.isDuet) then
@@ -579,136 +571,135 @@ begin
SMin := 0;
SMax := Czesci[P].Akt;
- SDet := SMin;
- // check if we can add new note
- Mozna := false;
- for S := SMin to SMax do
+ for BRange := Czas.OldBeatD+1 to Czas.AktBeatD do
begin
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ SDet := SMin;
+ // check if we can add new note
+ Mozna := false;
+ for S := SMin to SMax do
begin
- if ((Czesci[P].Czesc[S].Nuta[Pet].Start <= Czas.AktBeatD)
- and (Czesci[P].Czesc[S].Nuta[Pet].Start + Czesci[P].Czesc[S].Nuta[Pet].Dlugosc - 1 >= Czas.AktBeatD))
- and (not Czesci[P].Czesc[S].Nuta[Pet].FreeStyle) // but don't allow when it's FreeStyle note
- and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > 0) // and make sure the note lenghts is at least 1
- then
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
begin
- SDet := S;
- Mozna := true;
- Break;
+ if ((Czesci[P].Czesc[S].Nuta[Pet].Start <= BRange)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Start + Czesci[P].Czesc[S].Nuta[Pet].Dlugosc - 1 >= BRange))
+ and (not Czesci[P].Czesc[S].Nuta[Pet].FreeStyle) // but don't allow when it's FreeStyle note
+ and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > 0) // and make sure the note lenghts is at least 1
+ then
+ begin
+ SDet := S;
+ Mozna := true;
+ Break;
+ end;
end;
end;
- end;
- S := SDet;
+ S := SDet;
- if (Sound[CP].SzczytJest or DEBUG_NOTE_HIT) and (Mozna) then
- begin
- // operowanie na ostatniej nucie
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ if (Sound[CP].SzczytJest or DEBUG_NOTE_HIT) and Mozna then
begin
- if (Czesci[P].Czesc[S].Nuta[Pet].Start <= Czas.OldBeatD+1)
- and (Czesci[P].Czesc[S].Nuta[Pet].Start +
- Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > Czas.OldBeatD+1) then
+ // operate on the actual note
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
begin
- // przesuwanie tonu w odpowiednia game
- while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton > 6) do
- Sound[CP].Ton := Sound[CP].Ton - 12;
- while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton < -6) do
- Sound[CP].Ton := Sound[CP].Ton + 12;
-
- // Half size Notes Patch
- NoteHit := false;
-
- //if Ini.Difficulty = 0 then Range := 2;
- //if Ini.Difficulty = 1 then Range := 1;
- //if Ini.Difficulty = 2 then Range := 0;
- Range := 2 - Ini.Difficulty;
- if (abs(Czesci[P].Czesc[S].Nuta[Pet].Ton - Sound[CP].Ton) <= Range) or
- DEBUG_NOTE_HIT then
+ if (Czesci[P].Czesc[S].Nuta[Pet].Start <= BRange)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Start +
+ Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > BRange) then
begin
- Sound[CP].Ton := Czesci[P].Czesc[S].Nuta[Pet].Ton;
+ // przesuwanie tonu w odpowiednia game => shifting tone in the corresponding game?
+ while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton > 6) do
+ Sound[CP].Ton := Sound[CP].Ton - 12;
+ while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton < -6) do
+ Sound[CP].Ton := Sound[CP].Ton + 12;
// Half size Notes Patch
- NoteHit := true;
+ NoteHit := false;
- if (Ini.LineBonus = 0) then
+ Range := 2 - Ini.Difficulty;
+ if (abs(Czesci[P].Czesc[S].Nuta[Pet].Ton - Sound[CP].Ton) <= Range) or
+ DEBUG_NOTE_HIT then
begin
- // add points without LineBonus
- case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
- 1: Player[CP].Score := Player[CP].Score + 10000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
- 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 10000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ AktTon := Czesci[P].Czesc[S].Nuta[Pet].Ton;
+
+ // Half size Notes Patch
+ NoteHit := true;
+
+ if (Ini.LineBonus = 0) then
+ begin
+ // add points without LineBonus
+ case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
+ 1: Player[CP].Score := Player[CP].Score + 10000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 10000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ end;
+ end else
+ begin
+ // add points with Line Bonus
+ case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
+ 1: Player[CP].Score := Player[CP].Score + 9000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 9000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ end;
end;
- end else
- begin
- // add points with Line Bonus
- case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
- 1: Player[CP].Score := Player[CP].Score + 9000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
- 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 9000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
- end;
- end;
- Player[CP].ScoreI := Floor(Player[CP].Score / 10) * 10;
- Player[CP].ScoreGoldenI := Floor(Player[CP].ScoreGolden / 10) * 10;
-
- Player[CP].ScoreTotalI := Player[CP].ScoreI + Player[CP].ScoreGoldenI + Player[CP].ScoreLineI;
- end;
- end; // operowanie
- end;
-
- // sprawdzanie czy to nowa nuta, czy przedluzenie
- if S = SMax then
- begin
- Nowa := true;
- // jezeli ostatnia ma ten sam ton
- if (Player[CP].IlNut > 0 ) and (Player[CP].Nuta[Player[CP].HighNut].Ton = Sound[CP].Ton)
- and (Player[CP].Nuta[Player[CP].HighNut].Start + Player[CP].Nuta[Player[CP].HighNut].Dlugosc = Czas.AktBeatD)
- then
- Nowa := false;
-
- // jezeli jest jakas nowa nuta na sprawdzanym beacie
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
- if (Czesci[P].Czesc[S].Nuta[Pet].Start = Czas.AktBeatD) then
- Nowa := true;
+ Player[CP].ScoreI := Floor(Player[CP].Score / 10) * 10;
+ Player[CP].ScoreGoldenI := Floor(Player[CP].ScoreGolden / 10) * 10;
- // dodawanie nowej nuty
- if Nowa then
- begin
- // nowa nuta
- Player[CP].IlNut := Player[CP].IlNut + 1;
- Player[CP].HighNut := Player[CP].HighNut + 1;
- SetLength(Player[CP].Nuta, Player[CP].IlNut);
- Player[CP].Nuta[Player[CP].HighNut].Start := Czas.AktBeatD;
- Player[CP].Nuta[Player[CP].HighNut].Dlugosc := 1;
- Player[CP].Nuta[Player[CP].HighNut].Ton := Sound[CP].Ton; // Ton || TonDokl
- Player[CP].Nuta[Player[CP].HighNut].Detekt := Czas.MidBeat;
-
- // Half Note Patch
- Player[CP].Nuta[Player[CP].HighNut].Hit := NoteHit;
- end else
- begin
- // przedluzenie nuty
- Player[CP].Nuta[Player[CP].HighNut].Dlugosc := Player[CP].Nuta[Player[CP].HighNut].Dlugosc + 1;
+ Player[CP].ScoreTotalI := Player[CP].ScoreI + Player[CP].ScoreGoldenI + Player[CP].ScoreLineI;
+ end;
+ end; // operowanie
end;
-
- // check for perfect note and then lit the star (on Draw)
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ // checking whether a new note, or extend
+ if S = SMax then
begin
- if (Czesci[P].Czesc[S].Nuta[Pet].Start = Player[CP].Nuta[Player[CP].HighNut].Start)
- and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc = Player[CP].Nuta[Player[CP].HighNut].Dlugosc)
- and (Czesci[P].Czesc[S].Nuta[Pet].Ton = Player[CP].Nuta[Player[CP].HighNut].Ton) then
+ Nowa := true;
+ // if the latter has the same tone
+ if (Player[CP].IlNut > 0 ) and (Player[CP].Nuta[Player[CP].HighNut].Ton = AktTon)
+ and (Player[CP].Nuta[Player[CP].HighNut].Start + Player[CP].Nuta[Player[CP].HighNut].Dlugosc = BRange)
+ then
+ Nowa := false;
+
+ // If there is a new note on the checked Beat
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ if (Czesci[P].Czesc[S].Nuta[Pet].Start = BRange) then
+ Nowa := true;
+
+ // add a new note
+ if Nowa then
+ begin
+ // nowa nuta
+ Player[CP].IlNut := Player[CP].IlNut + 1;
+ Player[CP].HighNut := Player[CP].HighNut + 1;
+ SetLength(Player[CP].Nuta, Player[CP].IlNut);
+ Player[CP].Nuta[Player[CP].HighNut].Start := BRange;
+ Player[CP].Nuta[Player[CP].HighNut].Dlugosc := 1;
+ Player[CP].Nuta[Player[CP].HighNut].Ton := AktTon; // Ton || TonDokl
+ //Player[CP].Nuta[Player[CP].HighNut].Detekt := Czas.MidBeat;
+
+ // Half Note Patch
+ Player[CP].Nuta[Player[CP].HighNut].Hit := NoteHit;
+ end else
begin
- Player[CP].Nuta[Player[CP].HighNut].Perfect := true;
+ // extend notes
+ Player[CP].Nuta[Player[CP].HighNut].Dlugosc := Player[CP].Nuta[Player[CP].HighNut].Dlugosc + 1;
end;
- end;// else beep; // if S = SMax
- end; //for
- end; // if moze
+ // check for perfect note and then lit the star (on Draw)
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ begin
+ if (Czesci[P].Czesc[S].Nuta[Pet].Start = Player[CP].Nuta[Player[CP].HighNut].Start)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc = Player[CP].Nuta[Player[CP].HighNut].Dlugosc)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Ton = Player[CP].Nuta[Player[CP].HighNut].Ton) then
+ begin
+ Player[CP].Nuta[Player[CP].HighNut].Perfect := true;
+ end;
+
+ end;// else beep; // if S = SMax
+ end; //for
+ end; // if moze
+ end; // for BRange
//calc score last
SumN := 0;
NumS := 0;
@@ -758,135 +749,135 @@ begin
SMin := 0;
SMax := Czesci[P].Akt;
- SDet := SMin;
- // check if we can add new note
- Mozna := false;
- for S := SMin to SMax do
+ for BRange := Czas.OldBeatD+1 to Czas.AktBeatD do
begin
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ SDet := SMin;
+ // check if we can add new note
+ Mozna := false;
+ for S := SMin to SMax do
begin
- if ((Czesci[P].Czesc[S].Nuta[Pet].Start <= Czas.AktBeatD)
- and (Czesci[P].Czesc[S].Nuta[Pet].Start + Czesci[P].Czesc[S].Nuta[Pet].Dlugosc - 1 >= Czas.AktBeatD))
- and (not Czesci[P].Czesc[S].Nuta[Pet].FreeStyle) // but don't allow when it's FreeStyle note
- and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > 0) // and make sure the note lenghts is at least 1
- then
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
begin
- SDet := S;
- Mozna := true;
- Break;
+ if ((Czesci[P].Czesc[S].Nuta[Pet].Start <= BRange)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Start + Czesci[P].Czesc[S].Nuta[Pet].Dlugosc - 1 >= BRange))
+ and (not Czesci[P].Czesc[S].Nuta[Pet].FreeStyle) // but don't allow when it's FreeStyle note
+ and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > 0) // and make sure the note lenghts is at least 1
+ then
+ begin
+ SDet := S;
+ Mozna := true;
+ Break;
+ end;
end;
end;
- end;
- S := SDet;
+ S := SDet;
- if (Sound[CP].SzczytJest or DEBUG_NOTE_HIT) and (Mozna) then
- begin
- // operowanie na ostatniej nucie
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ if (Sound[CP].SzczytJest or DEBUG_NOTE_HIT) and (Mozna) then
begin
- if (Czesci[P].Czesc[S].Nuta[Pet].Start <= Czas.OldBeatD+1)
- and (Czesci[P].Czesc[S].Nuta[Pet].Start +
- Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > Czas.OldBeatD+1) then
+ // operowanie na ostatniej nucie
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
begin
- // przesuwanie tonu w odpowiednia game
- while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton > 6) do
- Sound[CP].Ton := Sound[CP].Ton - 12;
- while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton < -6) do
- Sound[CP].Ton := Sound[CP].Ton + 12;
-
- // Half size Notes Patch
- NoteHit := false;
-
- //if Ini.Difficulty = 0 then Range := 2;
- //if Ini.Difficulty = 1 then Range := 1;
- //if Ini.Difficulty = 2 then Range := 0;
- Range := 2 - Ini.Difficulty;
- if (abs(Czesci[P].Czesc[S].Nuta[Pet].Ton - Sound[CP].Ton) <= Range) or
- DEBUG_NOTE_HIT then
+ if (Czesci[P].Czesc[S].Nuta[Pet].Start <= BRange)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Start +
+ Czesci[P].Czesc[S].Nuta[Pet].Dlugosc > BRange) then
begin
- Sound[CP].Ton := Czesci[P].Czesc[S].Nuta[Pet].Ton;
+ // przesuwanie tonu w odpowiednia game
+ while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton > 6) do
+ Sound[CP].Ton := Sound[CP].Ton - 12;
+ while (Sound[CP].Ton - Czesci[P].Czesc[S].Nuta[Pet].Ton < -6) do
+ Sound[CP].Ton := Sound[CP].Ton + 12;
// Half size Notes Patch
- NoteHit := true;
+ NoteHit := false;
- if (Ini.LineBonus = 0) then
- begin
- // add points without LineBonus
- case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
- 1: Player[CP].Score := Player[CP].Score + 10000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
- 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 10000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
- end;
- end else
+ Range := 2 - Ini.Difficulty;
+ if (abs(Czesci[P].Czesc[S].Nuta[Pet].Ton - Sound[CP].Ton) <= Range) or
+ DEBUG_NOTE_HIT then
begin
- // add points with Line Bonus
- case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
- 1: Player[CP].Score := Player[CP].Score + 9000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
- 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 9000 / Czesci[P].Wartosc *
- Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ AktTon := Czesci[P].Czesc[S].Nuta[Pet].Ton;
+
+ // Half size Notes Patch
+ NoteHit := true;
+
+ if (Ini.LineBonus = 0) then
+ begin
+ // add points without LineBonus
+ case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
+ 1: Player[CP].Score := Player[CP].Score + 10000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 10000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ end;
+ end else
+ begin
+ // add points with Line Bonus
+ case Czesci[P].Czesc[S].Nuta[Pet].Wartosc of
+ 1: Player[CP].Score := Player[CP].Score + 9000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 9000 / Czesci[P].Wartosc *
+ Czesci[P].Czesc[S].Nuta[Pet].Wartosc;
+ end;
end;
- end;
-
- Player[CP].ScoreI := Floor(Player[CP].Score / 10) * 10;
- Player[CP].ScoreGoldenI := Floor(Player[CP].ScoreGolden / 10) * 10;
-
- Player[CP].ScoreTotalI := Player[CP].ScoreI + Player[CP].ScoreGoldenI + Player[CP].ScoreLineI;
- end;
- end; // operowanie
- end;
- // sprawdzanie czy to nowa nuta, czy przedluzenie
- if S = SMax then
- begin
- Nowa := true;
- // jezeli ostatnia ma ten sam ton
- if (Player[CP].IlNut > 0 ) and (Player[CP].Nuta[Player[CP].HighNut].Ton = Sound[CP].Ton)
- and (Player[CP].Nuta[Player[CP].HighNut].Start + Player[CP].Nuta[Player[CP].HighNut].Dlugosc = Czas.AktBeatD)
- then
- Nowa := false;
-
- // jezeli jest jakas nowa nuta na sprawdzanym beacie
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
- if (Czesci[P].Czesc[S].Nuta[Pet].Start = Czas.AktBeatD) then
- Nowa := true;
+ Player[CP].ScoreI := Floor(Player[CP].Score / 10) * 10;
+ Player[CP].ScoreGoldenI := Floor(Player[CP].ScoreGolden / 10) * 10;
- // dodawanie nowej nuty
- if Nowa then
- begin
- // nowa nuta
- Player[CP].IlNut := Player[CP].IlNut + 1;
- Player[CP].HighNut := Player[CP].HighNut + 1;
- SetLength(Player[CP].Nuta, Player[CP].IlNut);
- Player[CP].Nuta[Player[CP].HighNut].Start := Czas.AktBeatD;
- Player[CP].Nuta[Player[CP].HighNut].Dlugosc := 1;
- Player[CP].Nuta[Player[CP].HighNut].Ton := Sound[CP].Ton; // Ton || TonDokl
- Player[CP].Nuta[Player[CP].HighNut].Detekt := Czas.MidBeat;
-
- // Half Note Patch
- Player[CP].Nuta[Player[CP].HighNut].Hit := NoteHit;
- end else
- begin
- // przedluzenie nuty
- Player[CP].Nuta[Player[CP].HighNut].Dlugosc := Player[CP].Nuta[Player[CP].HighNut].Dlugosc + 1;
+ Player[CP].ScoreTotalI := Player[CP].ScoreI + Player[CP].ScoreGoldenI + Player[CP].ScoreLineI;
+ end;
+ end; // operowanie
end;
-
- // check for perfect note and then lit the star (on Draw)
- for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ // sprawdzanie czy to nowa nuta, czy przedluzenie
+ if S = SMax then
begin
- if (Czesci[P].Czesc[S].Nuta[Pet].Start = Player[CP].Nuta[Player[CP].HighNut].Start)
- and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc = Player[CP].Nuta[Player[CP].HighNut].Dlugosc)
- and (Czesci[P].Czesc[S].Nuta[Pet].Ton = Player[CP].Nuta[Player[CP].HighNut].Ton) then
+ Nowa := true;
+ // jezeli ostatnia ma ten sam ton
+ if (Player[CP].IlNut > 0 ) and (Player[CP].Nuta[Player[CP].HighNut].Ton = AktTon)
+ and (Player[CP].Nuta[Player[CP].HighNut].Start + Player[CP].Nuta[Player[CP].HighNut].Dlugosc = BRange)
+ then
+ Nowa := false;
+
+ // jezeli jest jakas nowa nuta na sprawdzanym beacie
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ if (Czesci[P].Czesc[S].Nuta[Pet].Start = BRange) then
+ Nowa := true;
+
+ // dodawanie nowej nuty
+ if Nowa then
+ begin
+ // nowa nuta
+ Player[CP].IlNut := Player[CP].IlNut + 1;
+ Player[CP].HighNut := Player[CP].HighNut + 1;
+ SetLength(Player[CP].Nuta, Player[CP].IlNut);
+ Player[CP].Nuta[Player[CP].HighNut].Start := BRange;
+ Player[CP].Nuta[Player[CP].HighNut].Dlugosc := 1;
+ Player[CP].Nuta[Player[CP].HighNut].Ton := AktTon; // Ton || TonDokl
+ //Player[CP].Nuta[Player[CP].HighNut].Detekt := Czas.MidBeat;
+
+ // Half Note Patch
+ Player[CP].Nuta[Player[CP].HighNut].Hit := NoteHit;
+ end else
begin
- Player[CP].Nuta[Player[CP].HighNut].Perfect := true;
+ // przedluzenie nuty
+ Player[CP].Nuta[Player[CP].HighNut].Dlugosc := Player[CP].Nuta[Player[CP].HighNut].Dlugosc + 1;
end;
- end;// else beep; // if S = SMax
- end; //for
- end; // if moze
+
+ // check for perfect note and then lit the star (on Draw)
+ for Pet := 0 to Czesci[P].Czesc[S].HighNut do
+ begin
+ if (Czesci[P].Czesc[S].Nuta[Pet].Start = Player[CP].Nuta[Player[CP].HighNut].Start)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Dlugosc = Player[CP].Nuta[Player[CP].HighNut].Dlugosc)
+ and (Czesci[P].Czesc[S].Nuta[Pet].Ton = Player[CP].Nuta[Player[CP].HighNut].Ton) then
+ begin
+ Player[CP].Nuta[Player[CP].HighNut].Perfect := true;
+ end;
+
+ end;// else beep; // if S = SMax
+ end; //for
+ end; // if moze
+ end; // for BRange
//calc score last
SumN := 0;
diff --git a/Game/Code/Classes/UThemes.pas b/Game/Code/Classes/UThemes.pas
index 25cec01b..3d1fa79c 100644
--- a/Game/Code/Classes/UThemes.pas
+++ b/Game/Code/Classes/UThemes.pas
@@ -523,6 +523,7 @@ type
//Song Preview
SelectSlidePreviewVolume: TThemeSelectSlide;
SelectSlidePreviewFading: TThemeSelectSlide;
+ SelectSlideDelay: TThemeSelectSlide;
ButtonExit: TThemeButton;
end;
@@ -1497,6 +1498,7 @@ begin
//Song Preview
ThemeLoadSelectSlide(OptionsSound.SelectSlidePreviewVolume, 'OptionsSoundSelectSlidePreviewVolume');
ThemeLoadSelectSlide(OptionsSound.SelectSlidePreviewFading, 'OptionsSoundSelectSlidePreviewFading');
+ ThemeLoadSelectSlide(OptionsSound.SelectSlideDelay, 'OptionsSoundSelectSlideDelay');
ThemeLoadButton(OptionsSound.ButtonExit, 'OptionsSoundButtonExit');
diff --git a/Game/Code/Screens/UScreenOptionsSound.pas b/Game/Code/Screens/UScreenOptionsSound.pas
index b9969aa5..5f842589 100644
--- a/Game/Code/Screens/UScreenOptionsSound.pas
+++ b/Game/Code/Screens/UScreenOptionsSound.pas
@@ -45,7 +45,8 @@ begin
end;
SDLK_RETURN:
begin
- if SelInteraction = 6 then begin
+ if SelInteraction = 7 then
+ begin
Ini.Save;
Music.PlayBack;
ScreenSong.MP3Volume := Ini.PreviewVolume * 10;
@@ -58,14 +59,16 @@ begin
InteractPrev;
SDLK_RIGHT:
begin
- if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ if (SelInteraction >= 0) and (SelInteraction <= 6) then
+ begin
Music.PlayOption;
InteractInc;
end;
end;
SDLK_LEFT:
begin
- if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ if (SelInteraction >= 0) and (SelInteraction <= 6) then
+ begin
Music.PlayOption;
InteractDec;
end;
@@ -87,8 +90,9 @@ begin
//Song Preview
AddSelectSlide(Theme.OptionsSound.SelectSlidePreviewVolume, Ini.PreviewVolume, IPreviewVolume);
- AddSelectSlide
- (Theme.OptionsSound.SelectSlidePreviewFading, Ini.PreviewFading, IPreviewFading);
+ AddSelectSlide(Theme.OptionsSound.SelectSlidePreviewFading, Ini.PreviewFading, IPreviewFading);
+
+ AddSelectSlide(Theme.OptionsSound.SelectSlideDelay, Ini.Delay, IDelay);
AddButton(Theme.OptionsSound.ButtonExit);
if (Length(Button[0].Text)=0) then
diff --git a/Game/Output/Languages/Dutch.ini b/Game/Output/Languages/Dutch.ini
index 2bd31e42..83f229a4 100644
--- a/Game/Output/Languages/Dutch.ini
+++ b/Game/Output/Languages/Dutch.ini
@@ -246,6 +246,7 @@ SING_OPTIONS_SOUND_MIC_BOOST = Mic versterken
SING_OPTIONS_SOUND_PREVIEWFADING = Crossfading
SING_OPTIONS_SOUND_PREVIEWVOLUME = Selectie Volume
SING_OPTIONS_SOUND_THRESHOLD = Drempelwaarde
+SING_OPTIONS_SOUND_DELAY = Delay (mic)
SING_OPTIONS_SOUND_TWO_PLAYERS_MODE = Twee speler modus
SING_OPTIONS_SOUND_WHEREAMI = Opties geluid
SING_OPTIONS_THEMES = Thema's
@@ -359,4 +360,4 @@ STAT_PREV = Vorige pagina
STAT_REVERSE = Anders om
VIDEO_ASPECT_CROP = Inkrimpen
VIDEO_ASPECT_LETTER_BOX = Letter Box
-VIDEO_ASPECT_STRETCH = Uitrekken \ No newline at end of file
+VIDEO_ASPECT_STRETCH = Uitrekken
diff --git a/Game/Output/Languages/English.ini b/Game/Output/Languages/English.ini
index 7a777354..d6c1aa19 100644
--- a/Game/Output/Languages/English.ini
+++ b/Game/Output/Languages/English.ini
@@ -246,6 +246,7 @@ SING_OPTIONS_SOUND_MIC_BOOST = Mic Boost
SING_OPTIONS_SOUND_PREVIEWFADING = Preview Fading
SING_OPTIONS_SOUND_PREVIEWVOLUME = Preview Volume
SING_OPTIONS_SOUND_THRESHOLD = Noise Threshold
+SING_OPTIONS_SOUND_DELAY = Delay (mic)
SING_OPTIONS_SOUND_TWO_PLAYERS_MODE = Two-Player Mode
SING_OPTIONS_SOUND_WHEREAMI = Sound Options
SING_OPTIONS_THEMES = themes
@@ -928,6 +929,9 @@ ENT_051 =     Determine the volume of song previews at the song selection menu
SUB_060 = Preview Fading
ENT_061 =     Determine how many seconds song previews take to fade in to preview volume
#-------------------------------------------------------#
+SUB_070 = Delay (mic)
+ENT_071 = Sets the delay time for the singing rating procedure. The tone detection is always behind the picture and music.
+#-------------------------------------------------------#
SEC_001 = General
RETURN = Confirm current selection
TAB = Toggle help
@@ -1201,7 +1205,6 @@ ENT_042 =     No notes appear on-screen and the corresponding lyrics appear in i
SEC_001 = General
TAB = Toggle help (pauses song)
PRINT = Take screenshot
-BACKSPACE = Exit song
ESC = Exit song
Q = Quit UltraStar Deluxe
#-------------------------------------------------------#
diff --git a/Game/Output/Languages/German.ini b/Game/Output/Languages/German.ini
index 8e5cc569..8e10236f 100644
--- a/Game/Output/Languages/German.ini
+++ b/Game/Output/Languages/German.ini
@@ -246,6 +246,7 @@ SING_OPTIONS_SOUND_MIC_BOOST = Mic-Anhebung
SING_OPTIONS_SOUND_PREVIEWFADING = Vorschau Fading
SING_OPTIONS_SOUND_PREVIEWVOLUME = Vorschau Lautst.
SING_OPTIONS_SOUND_THRESHOLD = Rauschunterdr.
+SING_OPTIONS_SOUND_DELAY = Verzögerung (Mic)
SING_OPTIONS_SOUND_TWO_PLAYERS_MODE = 2-Spieler-Modus
SING_OPTIONS_SOUND_WHEREAMI = Optionen Sound
SING_OPTIONS_THEMES = Themes
@@ -928,6 +929,9 @@ ENT_051 = Legt die Lautstärke bei der Liedvorschau in der Liedauswahl fest.
SUB_060 = Vorschau-Fading
ENT_061 = Legt die Wartezeit bis zum Abspielen der Liedvorschau fest.
#-------------------------------------------------------#
+SUB_070 = Delay (Mic)
+ENT_071 = Legt die Verzögerungszeit bei der Gesangsbewertung fest. Die Tonerkennung läuft nämlich immer dem Bild und der Musik hinterher.
+#-------------------------------------------------------#
SEC_001 = Allgemein
RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
TAB = Hilfe öffnen/schließen
@@ -1201,7 +1205,6 @@ ENT_042 = Hier darf nach Belieben mitgesprochen oder mitgegrölt werden!
SEC_001 = Allgemein
TAB = Hilfe öffnen/schließen
PRINT = Screenshot erstellen
-BACKSPACE = Singbildschirm verlassen
ESC = Singbildschirm verlassen
Q = UltraStar Deluxe beenden
#-------------------------------------------------------#
diff --git a/Game/Output/Languages/Italian.ini b/Game/Output/Languages/Italian.ini
index 4a8b97f1..a258e299 100644
--- a/Game/Output/Languages/Italian.ini
+++ b/Game/Output/Languages/Italian.ini
@@ -246,6 +246,7 @@ SING_OPTIONS_SOUND_MIC_BOOST = Amplificazione mic
SING_OPTIONS_SOUND_PREVIEWFADING = Fading anteprima
SING_OPTIONS_SOUND_PREVIEWVOLUME = Volume anteprima
SING_OPTIONS_SOUND_THRESHOLD = Soglia
+SING_OPTIONS_SOUND_DELAY = Delay (mic)
SING_OPTIONS_SOUND_TWO_PLAYERS_MODE = Modalità a due
SING_OPTIONS_SOUND_WHEREAMI = Opzioni suono
SING_OPTIONS_THEMES = Temi
diff --git a/Game/Output/Languages/Languages.xls b/Game/Output/Languages/Languages.xls
index 7736491d..8ae520ac 100644
--- a/Game/Output/Languages/Languages.xls
+++ b/Game/Output/Languages/Languages.xls
Binary files differ
diff --git a/Game/Output/Themes/Blue Sensation.ini b/Game/Output/Themes/Blue Sensation.ini
index 646e2867..0d6a3970 100644
--- a/Game/Output/Themes/Blue Sensation.ini
+++ b/Game/Output/Themes/Blue Sensation.ini
@@ -5527,11 +5527,31 @@ SBGDColor = ColorLight
STColor = White
STDColor = GrayDark
-[OptionsSoundButtonExit]
+[OptionsSoundSelectSlideDelay]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_DELAY
X = 40
Y = 415
W = 230
H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 470
+W = 230
+H = 70
Tex =MainBar
Color =ColorDark
DColor = ColorLight
diff --git a/Game/Output/Themes/Deluxe.ini b/Game/Output/Themes/Deluxe.ini
index d516e957..07b90805 100644
--- a/Game/Output/Themes/Deluxe.ini
+++ b/Game/Output/Themes/Deluxe.ini
@@ -4882,11 +4882,31 @@ SBGDColor = Gray
STColor = White
STDColor = GrayDark
-[OptionsSoundButtonExit]
+[OptionsSoundSelectSlideDelay]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_DELAY
X = 40
Y = 415
W = 230
H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 470
+W = 230
+H = 70
Tex =MainBar
Color = ColorDark
DColor = Gray
diff --git a/Game/Output/Themes/iStar.ini b/Game/Output/Themes/iStar.ini
index c17fd9da..9bd747ab 100644
--- a/Game/Output/Themes/iStar.ini
+++ b/Game/Output/Themes/iStar.ini
@@ -5505,11 +5505,31 @@ SBGDColor = Gray
STColor = White
STDColor = GrayDark
-[OptionsSoundButtonExit]
+[OptionsSoundSelectSlideDelay]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_DELAY
X = 40
Y = 415
W = 230
H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 470
+W = 230
+H = 70
Tex =MainBar
Color = ColorDark
DColor = Gray