From 665d1f930ea1f543f6c7b3a2fe6609735e8effb1 Mon Sep 17 00:00:00 2001 From: brunzelchen Date: Wed, 9 Dec 2009 19:29:14 +0000 Subject: added medley code changes git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/experimental@2013 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Medley/src/screens/UScreenSong.pas | 150 ++++++++++++++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 4 deletions(-) (limited to 'Medley/src/screens/UScreenSong.pas') diff --git a/Medley/src/screens/UScreenSong.pas b/Medley/src/screens/UScreenSong.pas index bd5eebe5..bab2ef51 100644 --- a/Medley/src/screens/UScreenSong.pas +++ b/Medley/src/screens/UScreenSong.pas @@ -53,6 +53,8 @@ uses UTime; type + TVisArr = array of integer; + TScreenSong = class(TMenu) private Equalizer: Tms_Equalizer; @@ -138,6 +140,9 @@ type procedure HideCatTL;// Show Cat in Tob left procedure Refresh; //Refresh Song Sorting procedure ChangeMusic; + + function getVisibleMedleyArr(): TVisArr; + procedure StartMedley(num: integer); //Party Mode procedure SelectRandomSong; procedure SetJoker; @@ -345,6 +350,21 @@ begin Exit; end; + Ord('S'): + begin + if (Length(getVisibleMedleyArr()) > 0) and (Mode = smNormal) and + (CatSongs.Song[Interaction].Medley.Source = msTag) then + begin + StartMedley(0); + end; + end; + Ord('D'): + begin + if (Length(getVisibleMedleyArr()) > 0) and (Mode = smNormal) then + begin + StartMedley(5); + end; + end; Ord('M'): //Show SongMenu begin if (Songs.SongList.Count > 0) then @@ -1002,6 +1022,11 @@ begin // Set texts Text[TextArtist].Text := CatSongs.Song[Interaction].Artist; Text[TextTitle].Text := CatSongs.Song[Interaction].Title; + + //medley mod + if CatSongs.Song[Interaction].Medley.Source = msTag then + Text[TextTitle].Text := Text[TextTitle].Text + '[M]'; + if (Ini.TabsAtStartup = 1) and (CatSongs.CatNumShow = -1) then begin Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].OrderNum) + '/' + IntToStr(CatSongs.CatCount); @@ -1496,6 +1521,9 @@ begin AudioPlayback.Stop; + if Mode = smMedley then + Mode := smNormal; + if Ini.Players <= 3 then PlayersPlay := Ini.Players + 1; if Ini.Players = 4 then PlayersPlay := 6; @@ -1725,19 +1753,29 @@ end; procedure TScreenSong.StartMusicPreview(); var - Song: TSong; + Song: TSong; + success: boolean; begin AudioPlayback.Close(); + if CatSongs.Song[Interaction].Main then + Exit; + Song := CatSongs.Song[Interaction]; - if not assigned(Song) then + if not assigned(Song) or Song.Main then Exit; if AudioPlayback.Open(Song.Path.Append(Song.Mp3)) then begin PreviewOpened := Interaction; - - AudioPlayback.Position := AudioPlayback.Length / 4; + + if Song.Medley.Source <> msNone then + begin + CurrentSong := Song; + AudioPlayback.Position := GetTimeFromBeat(Song.Medley.StartBeat); + end else + AudioPlayback.Position := AudioPlayback.Length / 4; + // set preview volume if (Ini.PreviewFading = 0) then begin @@ -1747,6 +1785,10 @@ begin end else begin + AudioPlayback.Position := AudioPlayback.Position - Ini.PreviewFading; + if AudioPlayback.Position<0 then + AudioPlayback.Position := 0; + // music fade enabled: start muted and fade-in AudioPlayback.SetVolume(0); AudioPlayback.FadeIn(Ini.PreviewFading, IPreviewVolumeVals[Ini.PreviewVolume]); @@ -1796,6 +1838,106 @@ begin end; end; +function TScreenSong.getVisibleMedleyArr(): TVisArr; +var + I: integer; + res: TVisArr; +begin + SetLength(res, 0); + for I := 0 to Length(CatSongs.Song) - 1 do + begin + if CatSongs.Song[I].Visible and (CatSongs.Song[I].Medley.Source = msTag) then + begin + SetLength(res, Length(res)+1); + res[Length(res)-1] := I; + end; + end; + Result := res; +end; + +//start Medley round +procedure TScreenSong.StartMedley(num: integer); + procedure AddSong(SongNr: integer); + begin + SetLength(PlaylistMedley.Song, Length(PlaylistMedley.Song)+1); + PlaylistMedley.Song[Length(PlaylistMedley.Song)-1] := SongNr; + end; + + function SongAdded(SongNr: integer): boolean; + var + i: integer; + skipped :boolean; + begin + skipped := false; + for i := 0 to Length(PlaylistMedley.Song) - 1 do + begin + if (SongNr=PlaylistMedley.Song[i]) then + begin + skipped:=true; + break; + end; + end; + Result:=skipped; + end; + + function NumSongsAdded(): Integer; + begin + Result := Length(PlaylistMedley.Song); + end; + + function GetNextSongNr: integer; + var + I, num: integer; + unused_arr: array of integer; + visible_arr: TVisArr; + begin + SetLength(unused_arr, 0); + visible_arr := getVisibleMedleyArr(); + for I := 0 to Length(visible_arr) - 1 do + begin + if (not SongAdded(visible_arr[I])) then + begin + SetLength(unused_arr, Length(unused_arr)+1); + unused_arr[Length(unused_arr)-1] := visible_arr[I]; + end; + end; + + num := random(Length(unused_arr)); + Result := unused_arr[num]; +end; + +var + I: integer; + VS: integer; + +begin + StopMusicPreview(); + Mode := smMedley; + + if num>0 then + begin + VS := Length(getVisibleMedleyArr()); + if VS < num then + PlaylistMedley.NumMedleySongs := VS + else + PlaylistMedley.NumMedleySongs := num; + + Randomize; + //set up Playlist Medley + SetLength(PlaylistMedley.Song, 0); + for I := 0 to PlaylistMedley.NumMedleySongs - 1 do + begin + AddSong(GetNextSongNr); + end; + end else + begin + SetLength(PlaylistMedley.Song, 1); + PlaylistMedley.Song[0] := Interaction; + PlaylistMedley.NumMedleySongs := 1; + end; + FadeTo(@ScreenSing); +end; + procedure TScreenSong.SkipTo(Target: cardinal); var i: integer; -- cgit v1.2.3