7 Commits
7 changed files with 122 additions and 90 deletions
+2 -2
View File
@@ -7,9 +7,9 @@
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<Version>$(VersionPrefix)2.1.7</Version>
<Version>$(VersionPrefix)2.1.8</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>2.1.7</FileVersion>
<FileVersion>2.1.8</FileVersion>
<Company>Goatgarien</Company>
<Copyright>2022</Copyright>
<StartupObject>BAKKA_Editor.Program</StartupObject>
+21 -19
View File
@@ -1,13 +1,16 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BAKKA_Editor
{
internal class Chart
{
private static readonly CultureInfo _defaultParsingCulture = CultureInfo.InvariantCulture;
public List<Note> Notes { get; set; }
public List<Gimmick> Gimmicks { get; set; }
/// <summary>
@@ -55,14 +58,13 @@ namespace BAKKA_Editor
var path = Utils.GetTag(line, "#MUSIC_FILE_PATH ");
if (path != null)
SongFileName = path;
var offset = Utils.GetTag(line, "#OFFSET");
if (offset != null)
Offset = Convert.ToDouble(offset);
Offset = Convert.ToDouble(offset, _defaultParsingCulture);
offset = Utils.GetTag(line, "#MOVIEOFFSET");
if (offset != null)
MovieOffset = Convert.ToDouble(offset);
MovieOffset = Convert.ToDouble(offset, _defaultParsingCulture);
if (line.Contains("#BODY"))
@@ -71,7 +73,7 @@ namespace BAKKA_Editor
break;
}
} while(++index < file.Length);
} while (++index < file.Length);
int lineNum;
Gimmick gimmickTemp;
@@ -83,46 +85,46 @@ namespace BAKKA_Editor
if (String.IsNullOrWhiteSpace(file[i]))
continue;
var parsed = file[i].Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var parsed = file[i].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
NoteBase temp = new();
temp.BeatInfo = new BeatInfo(Convert.ToInt32(parsed[0]), Convert.ToInt32(parsed[1]));
temp.GimmickType = (GimmickType)Convert.ToInt32(parsed[2]);
temp.BeatInfo = new BeatInfo(Convert.ToInt32(parsed[0], _defaultParsingCulture), Convert.ToInt32(parsed[1], _defaultParsingCulture));
temp.GimmickType = (GimmickType)Convert.ToInt32(parsed[2], _defaultParsingCulture);
switch (temp.GimmickType)
{
case GimmickType.NoGimmick:
noteTemp = new Note(temp.BeatInfo);
noteTemp.NoteType = (NoteType)Convert.ToInt32(parsed[3]);
lineNum = Convert.ToInt32(parsed[4]);
noteTemp.Position = Convert.ToInt32(parsed[5]);
noteTemp.Size = Convert.ToInt32(parsed[6]);
noteTemp.HoldChange = Convert.ToBoolean(Convert.ToInt32(parsed[7]));
noteTemp.NoteType = (NoteType)Convert.ToInt32(parsed[3], _defaultParsingCulture);
lineNum = Convert.ToInt32(parsed[4], _defaultParsingCulture);
noteTemp.Position = Convert.ToInt32(parsed[5], _defaultParsingCulture);
noteTemp.Size = Convert.ToInt32(parsed[6], _defaultParsingCulture);
noteTemp.HoldChange = Convert.ToBoolean(Convert.ToInt32(parsed[7], _defaultParsingCulture));
if (noteTemp.NoteType == NoteType.MaskAdd || noteTemp.NoteType == NoteType.MaskRemove)
{
noteTemp.MaskFill = (MaskType)Convert.ToInt32(parsed[8]);
noteTemp.MaskFill = (MaskType)Convert.ToInt32(parsed[8], _defaultParsingCulture);
}
else if (noteTemp.NoteType == NoteType.HoldStartNoBonus ||
noteTemp.NoteType == NoteType.HoldJoint ||
noteTemp.NoteType == NoteType.HoldStartBonusFlair)
{
refByLine[lineNum] = Convert.ToInt32(parsed[8]);
refByLine[lineNum] = Convert.ToInt32(parsed[8], _defaultParsingCulture);
}
Notes.Add(noteTemp);
notesByLine[lineNum] = Notes.Last();
break;
case GimmickType.BpmChange:
gimmickTemp = new Gimmick(temp.BeatInfo, temp.GimmickType);
gimmickTemp.BPM = Convert.ToDouble(parsed[3]);
gimmickTemp.BPM = Convert.ToDouble(parsed[3], _defaultParsingCulture);
Gimmicks.Add(gimmickTemp);
break;
case GimmickType.TimeSignatureChange:
gimmickTemp = new Gimmick(temp.BeatInfo, temp.GimmickType);
gimmickTemp.TimeSig = new TimeSignature() { Upper = Convert.ToInt32(parsed[3]), Lower = parsed.Length == 5 ? Convert.ToInt32(parsed[4]) : 4 };
gimmickTemp.TimeSig = new TimeSignature() { Upper = Convert.ToInt32(parsed[3], _defaultParsingCulture), Lower = parsed.Length == 5 ? Convert.ToInt32(parsed[4], _defaultParsingCulture) : 4 };
Gimmicks.Add(gimmickTemp);
break;
case GimmickType.HiSpeedChange:
gimmickTemp = new Gimmick(temp.BeatInfo, temp.GimmickType);
gimmickTemp.HiSpeed = Convert.ToDouble(parsed[3]);
gimmickTemp.HiSpeed = Convert.ToDouble(parsed[3], _defaultParsingCulture);
Gimmicks.Add(gimmickTemp);
break;
case GimmickType.ReverseStart:
@@ -191,7 +193,7 @@ namespace BAKKA_Editor
foreach (var note in Notes)
{
sw.Write($"{note.BeatInfo.Measure,4:F0}{note.BeatInfo.Beat,5:F0}{((int)note.GimmickType),5:F0}{(int)note.NoteType,5:F0}");
sw.Write($"{Notes.IndexOf(note),5:F0}{note.Position,5:F0}{note.Size,5:F0}{Convert.ToInt32(note.HoldChange),5:F0}");
sw.Write($"{Notes.IndexOf(note),5:F0}{note.Position,5:F0}{note.Size,5:F0}{Convert.ToInt32(note.HoldChange, _defaultParsingCulture),5:F0}");
if (note.IsMask)
sw.Write($"{(int)note.MaskFill,5:F0}");
if (note.NextNote != null)
@@ -264,7 +266,7 @@ namespace BAKKA_Editor
((60000.0 / evt.BPM) * 4.0 * evt.TimeSig.Ratio) * measure = time
time / ((60000.0 / evt.BPM) * 4.0 * evt.TimeSig.Ratio) = measure
*/
/// <summary>
/// Translate clock time to beats
/// </summary>
+52 -45
View File
@@ -18,6 +18,7 @@ namespace BAKKA_Editor
public float Radius { get; private set; }
public float CurrentMeasure { get; set; }
public float Hispeed { get; set; } = 1.5f;
public bool showHispeed { get; set; } = true;
// Pens and Brushes
public Pen BasePen { get; set; }
@@ -77,67 +78,73 @@ namespace BAKKA_Editor
{
//Convert hispeed to frames
float displayFrames = 73.0f - ((Hispeed - 1.5f) * 10.0f);
//Account for hispeed gimmick
List<Gimmick> HispeedChanges = new List<Gimmick>();
Gimmick InitialSpeed = chart.Gimmicks.Where(x => x.GimmickType == GimmickType.HiSpeedChange && CurrentMeasure > x.Measure).LastOrDefault();
//Add initial hispeed to list
if (InitialSpeed == null)
{
InitialSpeed = new Gimmick();
InitialSpeed.HiSpeed = 1.0;
}
HispeedChanges.Add(InitialSpeed);
//add all hispeed changes to list that happen within the current total time to show notes
float tempTotalTime = ((displayFrames / 60.0f) * 1000.0f);
float currentTime = chart.GetTime(new BeatInfo(CurrentMeasure));
float tempEndTime = currentTime + tempTotalTime;
HispeedChanges.AddRange(chart.Gimmicks.Where(
x => x.Measure >= CurrentMeasure
&& chart.GetTime(new BeatInfo(x.Measure)) < tempEndTime
&& x.GimmickType == GimmickType.HiSpeedChange).ToList());
if (HispeedChanges.Count > 1)
if (showHispeed)
{
for (int i = 0; i < HispeedChanges.Count; i++)
//Account for hispeed gimmick
List<Gimmick> HispeedChanges = new List<Gimmick>();
Gimmick InitialSpeed = chart.Gimmicks.Where(x => x.GimmickType == GimmickType.HiSpeedChange && CurrentMeasure > x.Measure).LastOrDefault();
//Add initial hispeed to list
if (InitialSpeed == null)
{
float timeDiff;
float itemTime;
float modifiedTime;
if (chart.GetTime(HispeedChanges[i].BeatInfo) <= (tempTotalTime + currentTime))
InitialSpeed = new Gimmick();
InitialSpeed.HiSpeed = 1.0;
}
HispeedChanges.Add(InitialSpeed);
//Random todos that im too lazy to put in applicable locations
//TODO: add "time" to notes so we can compare against it every time instead of always calculating what time a note is at
//TODO: add function to reevaluate the time of every note when bpm or TS is added/removed.
//add all hispeed changes to list that happen within the current total time to show notes
HispeedChanges.AddRange(chart.Gimmicks.Where(
x => x.Measure >= CurrentMeasure
&& chart.GetTime(new BeatInfo(x.Measure)) < tempEndTime
&& x.GimmickType == GimmickType.HiSpeedChange).ToList());
if (HispeedChanges.Count > 1)
{
for (int i = 0; i < HispeedChanges.Count; i++)
{
if (i == 0)
itemTime = currentTime;
else
itemTime = chart.GetTime(HispeedChanges[i].BeatInfo);
if (i != HispeedChanges.Count - 1)
float timeDiff;
float itemTime = chart.GetTime(HispeedChanges[i].BeatInfo);
float modifiedTime;
if (itemTime <= (tempTotalTime + currentTime))
{
float tempTestITimeDiff = (currentTime + tempTotalTime) - itemTime;
float tempTestIModifiedTime = (tempTestITimeDiff) / (float)(HispeedChanges[i].HiSpeed);
if ((currentTime + tempTotalTime - tempTestITimeDiff + tempTestIModifiedTime) < chart.GetTime(HispeedChanges[i + 1].BeatInfo))
if (i == 0)
itemTime = currentTime;
if (i != HispeedChanges.Count - 1)
{
float tempTestITimeDiff = (currentTime + tempTotalTime) - itemTime;
float tempTestIModifiedTime = (tempTestITimeDiff) / (float)(HispeedChanges[i].HiSpeed);
if ((currentTime + tempTotalTime - tempTestITimeDiff + tempTestIModifiedTime) < chart.GetTime(HispeedChanges[i + 1].BeatInfo))
{
timeDiff = (currentTime + tempTotalTime) - itemTime;
modifiedTime = timeDiff / (float)HispeedChanges[i].HiSpeed;
}
else
{
timeDiff = chart.GetTime(HispeedChanges[i + 1].BeatInfo) - itemTime;
modifiedTime = timeDiff / (float)HispeedChanges[i].HiSpeed;
}
}
else
{
timeDiff = (currentTime + tempTotalTime) - itemTime;
modifiedTime = timeDiff / (float)HispeedChanges[i].HiSpeed;
}
else
{
timeDiff = chart.GetTime(HispeedChanges[i + 1].BeatInfo) - itemTime;
modifiedTime = timeDiff / (float)HispeedChanges[i].HiSpeed;
}
tempTotalTime = tempTotalTime - timeDiff + modifiedTime;
}
else
{
timeDiff = (currentTime + tempTotalTime) - itemTime;
modifiedTime = timeDiff / (float)HispeedChanges[i].HiSpeed;
}
tempTotalTime = tempTotalTime - timeDiff + modifiedTime;
}
}
}
else
{
tempTotalTime /= (float)HispeedChanges[0].HiSpeed;
else
{
tempTotalTime /= (float)HispeedChanges[0].HiSpeed;
}
tempEndTime = currentTime + tempTotalTime;
}
//convert total time to total measure
tempEndTime = currentTime + tempTotalTime;
BeatInfo EndMeasure = chart.GetBeat(tempEndTime);
return EndMeasure.MeasureDecimal - CurrentMeasure;
}
+2 -2
View File
@@ -52,8 +52,8 @@ namespace BAKKA_Editor
internal enum MaskType
{
Clockwise = 0,
CounterClockwise = 1,
CounterClockwise = 0,
Clockwise = 1,
Center = 2
}
+17 -6
View File
@@ -101,6 +101,7 @@
this.highlightViewedNoteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.selectLastInsertedNoteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showGimmicksInCircleViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showGimmicksDuringPlaybackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.chartToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.initialChartSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -945,7 +946,8 @@
this.showCursorDuringPlaybackToolStripMenuItem,
this.highlightViewedNoteToolStripMenuItem,
this.selectLastInsertedNoteToolStripMenuItem,
this.showGimmicksInCircleViewToolStripMenuItem});
this.showGimmicksInCircleViewToolStripMenuItem,
this.showGimmicksDuringPlaybackToolStripMenuItem});
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.viewToolStripMenuItem.Text = "View";
@@ -956,14 +958,14 @@
this.showCursorToolStripMenuItem.CheckOnClick = true;
this.showCursorToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.showCursorToolStripMenuItem.Name = "showCursorToolStripMenuItem";
this.showCursorToolStripMenuItem.Size = new System.Drawing.Size(233, 22);
this.showCursorToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
this.showCursorToolStripMenuItem.Text = "Show Cursor";
this.showCursorToolStripMenuItem.Click += new System.EventHandler(this.showCursorToolStripMenuItem_Click);
//
// showCursorDuringPlaybackToolStripMenuItem
//
this.showCursorDuringPlaybackToolStripMenuItem.Name = "showCursorDuringPlaybackToolStripMenuItem";
this.showCursorDuringPlaybackToolStripMenuItem.Size = new System.Drawing.Size(233, 22);
this.showCursorDuringPlaybackToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
this.showCursorDuringPlaybackToolStripMenuItem.Text = "Show Cursor During Playback";
//
// highlightViewedNoteToolStripMenuItem
@@ -972,7 +974,7 @@
this.highlightViewedNoteToolStripMenuItem.CheckOnClick = true;
this.highlightViewedNoteToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.highlightViewedNoteToolStripMenuItem.Name = "highlightViewedNoteToolStripMenuItem";
this.highlightViewedNoteToolStripMenuItem.Size = new System.Drawing.Size(233, 22);
this.highlightViewedNoteToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
this.highlightViewedNoteToolStripMenuItem.Text = "Highlight Viewed Note";
//
// selectLastInsertedNoteToolStripMenuItem
@@ -981,7 +983,7 @@
this.selectLastInsertedNoteToolStripMenuItem.CheckOnClick = true;
this.selectLastInsertedNoteToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.selectLastInsertedNoteToolStripMenuItem.Name = "selectLastInsertedNoteToolStripMenuItem";
this.selectLastInsertedNoteToolStripMenuItem.Size = new System.Drawing.Size(233, 22);
this.selectLastInsertedNoteToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
this.selectLastInsertedNoteToolStripMenuItem.Text = "Select Last Inserted Note";
//
// showGimmicksInCircleViewToolStripMenuItem
@@ -990,10 +992,18 @@
this.showGimmicksInCircleViewToolStripMenuItem.CheckOnClick = true;
this.showGimmicksInCircleViewToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.showGimmicksInCircleViewToolStripMenuItem.Name = "showGimmicksInCircleViewToolStripMenuItem";
this.showGimmicksInCircleViewToolStripMenuItem.Size = new System.Drawing.Size(233, 22);
this.showGimmicksInCircleViewToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
this.showGimmicksInCircleViewToolStripMenuItem.Text = "Show Gimmicks In Circle View";
this.showGimmicksInCircleViewToolStripMenuItem.Click += new System.EventHandler(this.showGimmicksInCircleViewToolStripMenuItem_Click);
//
// showGimmicksDuringPlaybackToolStripMenuItem
//
this.showGimmicksDuringPlaybackToolStripMenuItem.CheckOnClick = true;
this.showGimmicksDuringPlaybackToolStripMenuItem.Name = "showGimmicksDuringPlaybackToolStripMenuItem";
this.showGimmicksDuringPlaybackToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
this.showGimmicksDuringPlaybackToolStripMenuItem.Text = "Show Gimmicks During Playback";
this.showGimmicksDuringPlaybackToolStripMenuItem.Click += new System.EventHandler(this.showGimmicksDuringPlaybackToolStripMenuItem_Click);
//
// chartToolStripMenuItem
//
this.chartToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -1577,5 +1587,6 @@
private TrackBar trackBarSpeed;
private Button gimmickJumpToCurrTimeButton;
private ToolStripMenuItem showGimmicksInCircleViewToolStripMenuItem;
private ToolStripMenuItem showGimmicksDuringPlaybackToolStripMenuItem;
}
}
+16 -8
View File
@@ -128,6 +128,7 @@ namespace BAKKA_Editor
showCursorDuringPlaybackToolStripMenuItem.Checked = userSettings.ViewSettings.ShowCursorDuringPlayback;
highlightViewedNoteToolStripMenuItem.Checked = userSettings.ViewSettings.HighlightViewedNote;
showGimmicksInCircleViewToolStripMenuItem.Checked = userSettings.ViewSettings.ShowGimmicks;
showGimmicksDuringPlaybackToolStripMenuItem.Checked = userSettings.ViewSettings.ShowGimmicksDuringPlayback;
selectLastInsertedNoteToolStripMenuItem.Checked = userSettings.ViewSettings.SelectLastInsertedNote;
visualHispeedNumeric.Value = (decimal)userSettings.ViewSettings.HispeedSetting;
trackBarVolume.Value = userSettings.ViewSettings.Volume;
@@ -349,14 +350,15 @@ namespace BAKKA_Editor
if (tempFilePath != "")
File.Delete(tempFilePath);
// Apply settings
userSettings.ViewSettings.ShowCursor = showCursorToolStripMenuItem.Checked;
userSettings.ViewSettings.ShowCursorDuringPlayback = showCursorDuringPlaybackToolStripMenuItem.Checked;
userSettings.ViewSettings.HighlightViewedNote = highlightViewedNoteToolStripMenuItem.Checked;
userSettings.ViewSettings.ShowGimmicks = showGimmicksInCircleViewToolStripMenuItem.Checked;
userSettings.ViewSettings.SelectLastInsertedNote = selectLastInsertedNoteToolStripMenuItem.Checked;
userSettings.ViewSettings.HispeedSetting = circleView.Hispeed;
userSettings.ViewSettings.Volume = trackBarVolume.Value;
userSettings.SaveSettings.AutoSaveInterval = autoSaveTimer.Interval / 60000;
userSettings.ViewSettings.ShowCursor = showCursorToolStripMenuItem.Checked;
userSettings.ViewSettings.ShowCursorDuringPlayback = showCursorDuringPlaybackToolStripMenuItem.Checked;
userSettings.ViewSettings.HighlightViewedNote = highlightViewedNoteToolStripMenuItem.Checked;
userSettings.ViewSettings.ShowGimmicks = showGimmicksInCircleViewToolStripMenuItem.Checked;
userSettings.ViewSettings.ShowGimmicksDuringPlayback = showGimmicksDuringPlaybackToolStripMenuItem.Checked;
userSettings.ViewSettings.SelectLastInsertedNote = selectLastInsertedNoteToolStripMenuItem.Checked;
userSettings.ViewSettings.HispeedSetting = circleView.Hispeed;
userSettings.ViewSettings.Volume = trackBarVolume.Value;
userSettings.SaveSettings.AutoSaveInterval = autoSaveTimer.Interval / 60000;
//Update user settings.toml
if (File.Exists("settings.toml"))
File.WriteAllText("settings.toml", Toml.FromModel(userSettings));
@@ -2193,5 +2195,11 @@ namespace BAKKA_Editor
currentSong.PlaybackSpeed = (trackBarSpeed.Value / (float)trackBarSpeed.Maximum);
labelSpeed.Text = $"Speed (x{currentSong.PlaybackSpeed:0.00})";
}
private void showGimmicksDuringPlaybackToolStripMenuItem_Click(object sender, EventArgs e)
{
circleView.showHispeed = showGimmicksDuringPlaybackToolStripMenuItem.Checked;
circlePanel.Invalidate();
}
}
}
+12 -8
View File
@@ -1,11 +1,13 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BAKKA_Editor
{
internal class UserSettings
{
public ViewSettings ViewSettings { get; set; } = new();
@@ -20,6 +22,7 @@ namespace BAKKA_Editor
public bool HighlightViewedNote { get; set; } = true;
public bool SelectLastInsertedNote { get; set; } = true;
public bool ShowGimmicks { get; set; } = true;
public bool ShowGimmicksDuringPlayback { get; set; } = true;
public float HispeedSetting { get; set; } = 1.5f;
public int Volume { get; set; } = 100;
}
@@ -34,13 +37,14 @@ namespace BAKKA_Editor
internal class HotkeySettings
{
public int TouchHotkey { get; set; } = Convert.ToInt32(Keys.D1);
public int SlideLeftHotkey { get; set; } = Convert.ToInt32(Keys.D2);
public int SlideRightHotkey { get; set; } = Convert.ToInt32(Keys.D3);
public int SnapUpHotkey { get; set; } = Convert.ToInt32(Keys.D4);
public int SnapDownHotkey { get; set; } = Convert.ToInt32(Keys.D5);
public int ChainHotkey { get; set; } = Convert.ToInt32(Keys.D6);
public int HoldHotkey { get; set; } = Convert.ToInt32(Keys.D7);
public int PlayHotkey { get; set; } = Convert.ToInt32(Keys.Space);
private static readonly CultureInfo _defaultParsingCulture = CultureInfo.InvariantCulture;
public int TouchHotkey { get; set; } = Convert.ToInt32(Keys.D1, _defaultParsingCulture);
public int SlideLeftHotkey { get; set; } = Convert.ToInt32(Keys.D2, _defaultParsingCulture);
public int SlideRightHotkey { get; set; } = Convert.ToInt32(Keys.D3, _defaultParsingCulture);
public int SnapUpHotkey { get; set; } = Convert.ToInt32(Keys.D4, _defaultParsingCulture);
public int SnapDownHotkey { get; set; } = Convert.ToInt32(Keys.D5, _defaultParsingCulture);
public int ChainHotkey { get; set; } = Convert.ToInt32(Keys.D6, _defaultParsingCulture);
public int HoldHotkey { get; set; } = Convert.ToInt32(Keys.D7, _defaultParsingCulture);
public int PlayHotkey { get; set; } = Convert.ToInt32(Keys.Space, _defaultParsingCulture);
}
}