diff --git a/Output/Languages/Deutsch.xml b/Output/Languages/Deutsch.xml
index e3aac4ae..abae22f4 100644
--- a/Output/Languages/Deutsch.xml
+++ b/Output/Languages/Deutsch.xml
@@ -23,6 +23,7 @@
Normal
Duett
Medley
+ Kurz-Version
Vocal Hero
Superstar
diff --git a/Output/Languages/English.xml b/Output/Languages/English.xml
index fb5d72e4..e6a4240f 100644
--- a/Output/Languages/English.xml
+++ b/Output/Languages/English.xml
@@ -23,6 +23,7 @@
Normal
Duet
Medley
+ Short version
Vocal Hero
Superstar
diff --git a/Vocaluxe/Base/CGame.cs b/Vocaluxe/Base/CGame.cs
index f0cf4245..54df8b2c 100644
--- a/Vocaluxe/Base/CGame.cs
+++ b/Vocaluxe/Base/CGame.cs
@@ -112,15 +112,18 @@ namespace Vocaluxe.Base
{
switch (Mode)
{
- case EGameMode.Normal:
+ case EGameMode.TR_GAMEMODE_NORMAL:
_GameMode = new CGameModeNormal();
break;
- case EGameMode.Medley:
+ case EGameMode.TR_GAMEMODE_MEDLEY:
_GameMode = new CGameModeMedley();
break;
- case EGameMode.Duet:
+ case EGameMode.TR_GAMEMODE_DUET:
_GameMode = new CGameModeDuet();
break;
+ case EGameMode.TR_GAMEMODE_SHORTSONG:
+ _GameMode = new CGameModeShortSong();
+ break;
default:
break;
}
diff --git a/Vocaluxe/GameModes/CGameMode.cs b/Vocaluxe/GameModes/CGameMode.cs
index b1dede96..2e1fbd2d 100644
--- a/Vocaluxe/GameModes/CGameMode.cs
+++ b/Vocaluxe/GameModes/CGameMode.cs
@@ -202,7 +202,7 @@ namespace Vocaluxe.GameModes
{
if (_ActualSong > -1)
{
- _Points.SetPoints(_ActualSong, _Songs[_ActualSong].ID, Player, _GameMode == EGameMode.Medley, _GameMode == EGameMode.Duet);
+ _Points.SetPoints(_ActualSong, _Songs[_ActualSong].ID, Player, _GameMode == EGameMode.TR_GAMEMODE_MEDLEY, _GameMode == EGameMode.TR_GAMEMODE_DUET);
}
_ActualSong++;
}
diff --git a/Vocaluxe/GameModes/CGameModeDuet.cs b/Vocaluxe/GameModes/CGameModeDuet.cs
index cf105151..09f64b95 100644
--- a/Vocaluxe/GameModes/CGameModeDuet.cs
+++ b/Vocaluxe/GameModes/CGameModeDuet.cs
@@ -10,7 +10,7 @@ namespace Vocaluxe.GameModes
{
base.Init();
- _GameMode = EGameMode.Duet;
+ _GameMode = EGameMode.TR_GAMEMODE_DUET;
_Initialized = true;
}
}
diff --git a/Vocaluxe/GameModes/CGameModeMedley.cs b/Vocaluxe/GameModes/CGameModeMedley.cs
index 7b22f145..7257e86a 100644
--- a/Vocaluxe/GameModes/CGameModeMedley.cs
+++ b/Vocaluxe/GameModes/CGameModeMedley.cs
@@ -13,7 +13,7 @@ namespace Vocaluxe.GameModes
{
base.Init();
- _GameMode = EGameMode.Medley;
+ _GameMode = EGameMode.TR_GAMEMODE_MEDLEY;
_Initialized = true;
}
diff --git a/Vocaluxe/GameModes/CGameModeNormal.cs b/Vocaluxe/GameModes/CGameModeNormal.cs
index 6a27341b..008d55cc 100644
--- a/Vocaluxe/GameModes/CGameModeNormal.cs
+++ b/Vocaluxe/GameModes/CGameModeNormal.cs
@@ -10,7 +10,7 @@ namespace Vocaluxe.GameModes
{
base.Init();
- _GameMode = EGameMode.Normal;
+ _GameMode = EGameMode.TR_GAMEMODE_NORMAL;
_Initialized = true;
}
}
diff --git a/Vocaluxe/GameModes/CGameModeShortSong.cs b/Vocaluxe/GameModes/CGameModeShortSong.cs
new file mode 100644
index 00000000..18027a52
--- /dev/null
+++ b/Vocaluxe/GameModes/CGameModeShortSong.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using Vocaluxe.Base;
+using Vocaluxe.Lib.Song;
+
+namespace Vocaluxe.GameModes
+{
+ class CGameModeShortSong : CGameMode
+ {
+ public override void Init()
+ {
+ base.Init();
+
+ _GameMode = EGameMode.TR_GAMEMODE_SHORTSONG;
+ _Initialized = true;
+ }
+
+ protected override void SongManipulation(int SongIndex)
+ {
+ CSong song = _Songs[SongIndex];
+
+ song.Finish = CGame.GetTimeFromBeats(song.ShortEnd, song.BPM) + CSettings.DefaultMedleyFadeOutTime + song.Gap;
+
+ // set lines to medley mode
+ song.Notes.SetMedley(song.Notes.GetLines(0).Line[0].FirstNoteBeat, song.ShortEnd);
+ }
+ }
+}
diff --git a/Vocaluxe/GameModes/IGameMode.cs b/Vocaluxe/GameModes/IGameMode.cs
index e7d69afb..3daba3a2 100644
--- a/Vocaluxe/GameModes/IGameMode.cs
+++ b/Vocaluxe/GameModes/IGameMode.cs
@@ -9,9 +9,10 @@ namespace Vocaluxe.GameModes
{
public enum EGameMode
{
- Normal,
- Medley,
- Duet
+ TR_GAMEMODE_NORMAL,
+ TR_GAMEMODE_MEDLEY,
+ TR_GAMEMODE_DUET,
+ TR_GAMEMODE_SHORTSONG
}
interface IGameMode
diff --git a/Vocaluxe/Lib/Song/CSong.cs b/Vocaluxe/Lib/Song/CSong.cs
index e906c285..bd8a8df5 100644
--- a/Vocaluxe/Lib/Song/CSong.cs
+++ b/Vocaluxe/Lib/Song/CSong.cs
@@ -59,6 +59,8 @@ namespace Vocaluxe.Lib.Song
public bool CalculateMedley = true;
public float PreviewStart = 0f;
+ public int ShortEnd = 0;
+
public Encoding Encoding = Encoding.Default;
public string Folder = String.Empty;
public string FolderName = String.Empty;
@@ -161,6 +163,8 @@ namespace Vocaluxe.Lib.Song
this.CalculateMedley = song.CalculateMedley;
this.PreviewStart = song.PreviewStart;
+ this.ShortEnd = song.ShortEnd;
+
this.Encoding = song.Encoding;
this.Folder = song.Folder;
this.FolderName = song.FolderName;
@@ -652,6 +656,7 @@ namespace Vocaluxe.Lib.Song
return false;
}
FindRefrain();
+ FindShortEnd();
_NotesLoaded = true;
return true;
@@ -836,5 +841,88 @@ namespace Vocaluxe.Lib.Song
this.PreviewStart = CGame.GetTimeFromBeats(this.Medley.StartBeat, this.BPM);
}
}
+
+ private void FindShortEnd(){
+ CLines lines = this.Notes.GetLines(0);
+
+ if (lines.LineCount == 0)
+ return;
+
+ // build sentences list
+ List sentences = new List();
+ foreach (CLine line in lines.Line)
+ {
+ if (line.Points != 0)
+ sentences.Add(line.Lyrics);
+ else
+ sentences.Add(String.Empty);
+ }
+
+ // find equal sentences series
+ List series = new List();
+ for (int i = 0; i < lines.LineCount - 1; i++)
+ {
+ for (int j = i + 1; j < lines.LineCount; j++)
+ {
+ if (sentences[i] == sentences[j] && sentences[i] != String.Empty)
+ {
+ Series tempSeries = new Series();
+ tempSeries.start = i;
+ tempSeries.end = i;
+
+ int max = 0;
+ if (j + j - i - 1 > lines.LineCount - 1)
+ max = lines.LineCount - 1 - j;
+ else
+ max = j - i - 1;
+
+ for (int k = 1; k <= max; k++)
+ {
+ if (sentences[i + k] == sentences[j + k] && sentences[i + k] != String.Empty)
+ tempSeries.end = i + k;
+ else
+ break;
+ }
+
+ tempSeries.length = tempSeries.end - tempSeries.start + 1;
+ series.Add(tempSeries);
+ }
+ }
+ }
+
+ //Calculate length of singing
+ int stop = (lines.Line[lines.Line.Length - 1].LastNoteBeat - lines.Line[0].FirstNoteBeat) / 2;
+
+ //Check if stop is in series
+ for (int i = 0; i < series.Count; i++)
+ {
+ if (lines.Line[series[i].start].FirstNoteBeat < stop && lines.Line[series[i].end].LastNoteBeat > stop)
+ {
+ if (stop < (lines.Line[series[i].start].FirstNoteBeat + ((lines.Line[series[i].end].LastNoteBeat - lines.Line[series[i].start].FirstNoteBeat) / 2)))
+ {
+ this.ShortEnd = lines.Line[series[i].start-1].LastNote.EndBeat;
+ return;
+ }
+ else
+ {
+ this.ShortEnd = lines.Line[series[i].end].LastNote.EndBeat;
+ return;
+ }
+ }
+ }
+
+ //Check if stop is in line
+ for (int i = 0; i < lines.Line.Length; i++)
+ {
+ if (lines.Line[i].FirstNoteBeat < stop && lines.Line[i].LastNoteBeat > stop)
+ {
+ this.ShortEnd = lines.Line[i].LastNoteBeat;
+ return;
+ }
+ }
+
+ ShortEnd = stop;
+
+ }
}
}
diff --git a/Vocaluxe/Screens/CPopupScreenPlayerControl.cs b/Vocaluxe/Screens/CPopupScreenPlayerControl.cs
index 85e1467d..cb21d9d4 100644
--- a/Vocaluxe/Screens/CPopupScreenPlayerControl.cs
+++ b/Vocaluxe/Screens/CPopupScreenPlayerControl.cs
@@ -214,9 +214,9 @@ namespace Vocaluxe.Screens
if (SongNr >= 0 && CSongs.SongsLoaded)
{
if (Duet)
- CGame.SetGameMode(GameModes.EGameMode.Duet);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_DUET);
else
- CGame.SetGameMode(GameModes.EGameMode.Normal);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL);
CGame.Reset();
CGame.ClearSongs();
diff --git a/Vocaluxe/Screens/CScreenHighscore.cs b/Vocaluxe/Screens/CScreenHighscore.cs
index 6f499513..78c199fd 100644
--- a/Vocaluxe/Screens/CScreenHighscore.cs
+++ b/Vocaluxe/Screens/CScreenHighscore.cs
@@ -250,15 +250,15 @@ namespace Vocaluxe.Screens
switch (CGame.GameMode)
{
- case EGameMode.Normal:
+ case EGameMode.TR_GAMEMODE_NORMAL:
Texts[htTexts(TextSongMode)].Text = "TR_GAMEMODE_NORMAL";
break;
- case EGameMode.Medley:
+ case EGameMode.TR_GAMEMODE_MEDLEY:
Texts[htTexts(TextSongMode)].Text = "TR_GAMEMODE_MEDLEY";
break;
- case EGameMode.Duet:
+ case EGameMode.TR_GAMEMODE_DUET:
Texts[htTexts(TextSongMode)].Text = "TR_GAMEMODE_DUET";
_IsDuet = true;
break;
diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs
index d8035d7a..4c5427d2 100644
--- a/Vocaluxe/Screens/CScreenSong.cs
+++ b/Vocaluxe/Screens/CScreenSong.cs
@@ -347,9 +347,9 @@ namespace Vocaluxe.Screens
else
{
if (CSongs.VisibleSongs[SongNr].IsDuet)
- CGame.SetGameMode(GameModes.EGameMode.Duet);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_DUET);
else
- CGame.SetGameMode(GameModes.EGameMode.Normal);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL);
}
CGame.Reset();
@@ -366,7 +366,7 @@ namespace Vocaluxe.Screens
if ((CSongs.Category >= 0) && (SongNr >= 0))
{
if (CSongs.VisibleSongs[SongNr].Medley.Source != EMedleySource.None)
- CGame.SetGameMode(GameModes.EGameMode.Medley);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_MEDLEY);
else
return;
@@ -382,7 +382,7 @@ namespace Vocaluxe.Screens
{
CGame.Reset();
CGame.ClearSongs();
- CGame.SetGameMode(GameModes.EGameMode.Normal);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL);
List IDs = new List();
for (int i = 0; i < CSongs.AllSongs.Length; i++)
@@ -409,7 +409,7 @@ namespace Vocaluxe.Screens
{
CGame.Reset();
CGame.ClearSongs();
- CGame.SetGameMode(GameModes.EGameMode.Normal);
+ CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL);
List IDs = new List();
for (int i = 0; i < CSongs.VisibleSongs.Length; i++)
@@ -491,18 +491,20 @@ namespace Vocaluxe.Screens
SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Clear();
if (!CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].IsDuet)
{
- SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.Normal));
- _AvailableGameModes.Add(GameModes.EGameMode.Normal);
+ SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_NORMAL));
+ _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_NORMAL);
+ SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_SHORTSONG));
+ _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_SHORTSONG);
}
if (CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].IsDuet)
{
- SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.Duet));
- _AvailableGameModes.Add(GameModes.EGameMode.Duet);
+ SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_DUET));
+ _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_DUET);
}
if (CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].Medley.Source != EMedleySource.None)
{
- SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.Medley));
- _AvailableGameModes.Add(GameModes.EGameMode.Medley);
+ SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_MEDLEY));
+ _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_MEDLEY);
}
SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Visible = true;
Buttons[htButtons(ButtonOptionsClose)].Visible = true;
diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj
index e8282b61..7dfc6eea 100644
--- a/Vocaluxe/Vocaluxe.csproj
+++ b/Vocaluxe/Vocaluxe.csproj
@@ -135,6 +135,7 @@
+
Form