diff --git a/BAKKA-Editor/Chart.cs b/BAKKA-Editor/Chart.cs index 21a2cc4..402e2dd 100644 --- a/BAKKA-Editor/Chart.cs +++ b/BAKKA-Editor/Chart.cs @@ -257,10 +257,14 @@ namespace BAKKA_Editor TimeEvents[0].StartTime = Offset * 1000.0; for (int i = 1; i < TimeEvents.Count; i++) { - TimeEvents[i].StartTime = ((TimeEvents[i].Measure - TimeEvents[i - 1].Measure) * 4 * TimeEvents[i - 1].TimeSig.Ratio * (60000.0 / TimeEvents[i].BPM)) + TimeEvents[i - 1].StartTime; + TimeEvents[i].StartTime = ((TimeEvents[i].Measure - TimeEvents[i - 1].Measure) * (4.0f * TimeEvents[i - 1].TimeSig.Ratio * (60000.0 / TimeEvents[i - 1].BPM))) + TimeEvents[i - 1].StartTime; } } - + /* + ((60000.0 / evt.BPM) * 4.0 * evt.TimeSig.Ratio) * measure = time + time / ((60000.0 / evt.BPM) * 4.0 * evt.TimeSig.Ratio) = measure + */ + /// /// Translate clock time to beats /// @@ -274,7 +278,7 @@ namespace BAKKA_Editor var evt = TimeEvents.Where(x => time >= x.StartTime).LastOrDefault(); if (evt == null) evt = TimeEvents[0]; - return new BeatInfo((float)(evt.BPM * (time - evt.StartTime) / (60000.0f * evt.TimeSig.Ratio * 4)) + evt.Measure); + return new BeatInfo((float)((time - evt.StartTime) / ((60000.0 / evt.BPM) * 4.0f * evt.TimeSig.Ratio) + evt.Measure)); } /// @@ -290,7 +294,7 @@ namespace BAKKA_Editor var evt = TimeEvents.Where(x => beat.MeasureDecimal >= x.Measure).LastOrDefault(); if (evt == null) evt = TimeEvents[0]; - return (int)((60000.0 * 4.0 * evt.TimeSig.Ratio / evt.BPM) * (beat.MeasureDecimal - evt.Measure) + evt.StartTime); + return (int)(((60000.0 / evt.BPM) * 4.0f * evt.TimeSig.Ratio) * (beat.MeasureDecimal - evt.Measure) + evt.StartTime); } } -} +} \ No newline at end of file diff --git a/BAKKA-Editor/CircleView.cs b/BAKKA-Editor/CircleView.cs index 2552ac9..4a0a81c 100644 --- a/BAKKA-Editor/CircleView.cs +++ b/BAKKA-Editor/CircleView.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Drawing.Drawing2D; using System.Threading.Tasks; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock; namespace BAKKA_Editor { @@ -15,10 +16,7 @@ namespace BAKKA_Editor public PointF CenterPoint { get; private set; } public float Radius { get; private set; } public float CurrentMeasure { get; set; } - /// - /// Number of measures in the future that are visible - /// - public float TotalMeasureShowNotes { get; set; } = 0.5f; + public float Hispeed { get; set; } = 1.5f; // Pens and Brushes public Pen BasePen { get; set; } @@ -74,10 +72,27 @@ namespace BAKKA_Editor FlairPen = new Pen(Color.FromArgb(FlairTransparency, Color.Yellow), PanelSize.Width * 8.0f / 600.0f); } - private ArcInfo GetScaledRect(float objectTime) + private float GetTotalMeasureShowNotes(Chart chart) + { + //Convert hispeed to frames + float displayFrames = 73.0f - ((Hispeed - 1.5f) * 10.0f); + //Account for hispeed gimmick + var LatestHispeedChange = chart.Gimmicks.Where(x => x.GimmickType == GimmickType.HiSpeedChange && CurrentMeasure >= x.Measure).LastOrDefault(); + if (LatestHispeedChange != null) + { + displayFrames = displayFrames / (float)LatestHispeedChange.HiSpeed; + } + //Add frame time to current time + float EndTimeDisplay = chart.GetTime(new BeatInfo(CurrentMeasure)) + ((displayFrames / 60.0f) * 1000.0f); + //convert time back to a measureDecimal + BeatInfo EndMeasure = chart.GetBeat(EndTimeDisplay); + return EndMeasure.MeasureDecimal - CurrentMeasure; + } + + private ArcInfo GetScaledRect(Chart chart, float objectTime) { ArcInfo info = new(); - float notescaleInit = 1 - ((objectTime - CurrentMeasure) * (1 / TotalMeasureShowNotes)); // Scale from 0-1 + float notescaleInit = 1 - ((objectTime - CurrentMeasure) * (1 / GetTotalMeasureShowNotes(chart))); // Scale from 0-1 info.NoteScale = (float)Math.Pow(10.0f, notescaleInit) / 10.0f; float scaledRectSize = DrawRect.Width * info.NoteScale; float scaledRadius = scaledRectSize / 2.0f; @@ -89,9 +104,9 @@ namespace BAKKA_Editor return info; } - private ArcInfo GetArcInfo(Note note) + private ArcInfo GetArcInfo(Chart chart, Note note) { - ArcInfo info = GetScaledRect(note.Measure); + ArcInfo info = GetScaledRect(chart, note.Measure); info.StartAngle = -note.Position * 6; info.ArcLength = -note.Size * 6; if(info.ArcLength != -360) @@ -191,15 +206,15 @@ namespace BAKKA_Editor } } - public void DrawCircle() + public void DrawCircle(Chart chart) { // Switch drawing modes bufGraphics.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // Draw measure circle - for (float meas = (float)Math.Ceiling(CurrentMeasure); (meas - CurrentMeasure) < TotalMeasureShowNotes; meas += 1.0f) + for (float meas = (float)Math.Ceiling(CurrentMeasure); (meas - CurrentMeasure) < GetTotalMeasureShowNotes(chart); meas += 1.0f) { - var info = GetScaledRect(meas); + var info = GetScaledRect(chart, meas); if (info.Rect.Width >= 1) { bufGraphics.Graphics.DrawEllipse(BeatPen, info.Rect); @@ -248,11 +263,11 @@ namespace BAKKA_Editor { List drawGimmicks = chart.Gimmicks.Where( x => x.Measure >= CurrentMeasure - && x.Measure <= (CurrentMeasure + TotalMeasureShowNotes)).ToList(); + && x.Measure <= (CurrentMeasure + GetTotalMeasureShowNotes(chart))).ToList(); foreach (var gimmick in drawGimmicks) { - var info = GetScaledRect(gimmick.Measure); + var info = GetScaledRect(chart, gimmick.Measure); if (info.Rect.Width >= 1) { @@ -264,19 +279,19 @@ namespace BAKKA_Editor public void DrawHolds(Chart chart, bool highlightSelectedNote, int selectedNoteIndex) { - ArcInfo currentInfo = GetScaledRect(CurrentMeasure); - ArcInfo endInfo = GetScaledRect(CurrentMeasure + TotalMeasureShowNotes); + ArcInfo currentInfo = GetScaledRect(chart, CurrentMeasure); + ArcInfo endInfo = GetScaledRect(chart, CurrentMeasure + GetTotalMeasureShowNotes(chart)); // First, draw holes that start before the viewpoint and have nodes that end after List holdNotes = chart.Notes.Where( x => x.Measure < CurrentMeasure && x.NextNote != null - && x.NextNote.Measure > (CurrentMeasure + TotalMeasureShowNotes) + && x.NextNote.Measure > (CurrentMeasure + GetTotalMeasureShowNotes(chart)) && x.IsHold).ToList(); foreach (var note in holdNotes) { - ArcInfo info = GetArcInfo(note); - ArcInfo nextInfo = GetArcInfo((Note)note.NextNote); + ArcInfo info = GetArcInfo(chart, note); + ArcInfo nextInfo = GetArcInfo(chart, (Note)note.NextNote); //GraphicsPath path = new GraphicsPath(); //path.AddArc(endInfo.Rect, info.StartAngle, info.ArcLength); //path.AddArc(currentInfo.Rect, info.StartAngle + info.ArcLength, -info.ArcLength); @@ -323,16 +338,16 @@ namespace BAKKA_Editor // Second, draw all the notes on-screen holdNotes = chart.Notes.Where( x => x.Measure >= CurrentMeasure - && x.Measure <= (CurrentMeasure + TotalMeasureShowNotes) + && x.Measure <= (CurrentMeasure + GetTotalMeasureShowNotes(chart)) && x.IsHold).ToList(); foreach (var note in holdNotes) { - ArcInfo info = GetArcInfo(note); + ArcInfo info = GetArcInfo(chart, note); // If the previous note is off-screen, this case handles that if (note.PrevNote != null && note.PrevNote.Measure < CurrentMeasure) { - ArcInfo prevInfo = GetArcInfo((Note)note.PrevNote); + ArcInfo prevInfo = GetArcInfo(chart, (Note)note.PrevNote); float ratio = (currentInfo.Rect.Width - info.Rect.Width) / (prevInfo.Rect.Width - info.Rect.Width); float startNoteAngle = info.StartAngle; float endNoteAngle = prevInfo.StartAngle; @@ -356,9 +371,9 @@ namespace BAKKA_Editor } // If the next note is on-screen, this case handles that - if (note.NextNote != null && note.NextNote.Measure <= (CurrentMeasure + TotalMeasureShowNotes)) + if (note.NextNote != null && note.NextNote.Measure <= (CurrentMeasure + GetTotalMeasureShowNotes(chart))) { - ArcInfo nextInfo = GetArcInfo((Note)note.NextNote); + ArcInfo nextInfo = GetArcInfo(chart, (Note)note.NextNote); GraphicsPath path = new GraphicsPath(); path.AddArc(info.Rect, info.StartAngle, info.ArcLength); path.AddArc(nextInfo.Rect, nextInfo.StartAngle + nextInfo.ArcLength, -nextInfo.ArcLength); @@ -366,9 +381,9 @@ namespace BAKKA_Editor } // If the next note is off-screen, this case handles that - if (note.NextNote != null && note.NextNote.Measure > (CurrentMeasure + TotalMeasureShowNotes)) + if (note.NextNote != null && note.NextNote.Measure > (CurrentMeasure + GetTotalMeasureShowNotes(chart))) { - ArcInfo nextInfo = GetArcInfo((Note)note.NextNote); + ArcInfo nextInfo = GetArcInfo(chart, (Note)note.NextNote); float ratio = (endInfo.Rect.Width - nextInfo.Rect.Width) / (info.Rect.Width - nextInfo.Rect.Width); float startNoteAngle = nextInfo.StartAngle; float endNoteAngle = info.StartAngle; @@ -416,11 +431,11 @@ namespace BAKKA_Editor { List drawNotes = chart.Notes.Where( x => x.Measure >= CurrentMeasure - && x.Measure <= (CurrentMeasure + TotalMeasureShowNotes) + && x.Measure <= (CurrentMeasure + GetTotalMeasureShowNotes(chart)) && !x.IsHold && !x.IsMask).ToList(); foreach (var note in drawNotes) { - ArcInfo info = GetArcInfo(note); + ArcInfo info = GetArcInfo(chart, note); if (info.Rect.Width >= 1) { diff --git a/BAKKA-Editor/MainForm.Designer.cs b/BAKKA-Editor/MainForm.Designer.cs index 5f9ae66..c2aa526 100644 --- a/BAKKA-Editor/MainForm.Designer.cs +++ b/BAKKA-Editor/MainForm.Designer.cs @@ -100,6 +100,7 @@ this.showCursorDuringPlaybackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.highlightViewedNoteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.selectLastInsertedNoteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showGimmicksInCircleViewToolStripMenuItem = 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(); @@ -140,7 +141,6 @@ this.noteNextButton = new System.Windows.Forms.Button(); this.notePrevButton = new System.Windows.Forms.Button(); this.autoSaveTimer = new System.Windows.Forms.Timer(this.components); - this.showGimmicksInCircleViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.beat2Numeric)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.beat1Numeric)).BeginInit(); @@ -846,12 +846,13 @@ // this.visualHispeedNumeric.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.visualHispeedNumeric.DecimalPlaces = 2; + this.visualHispeedNumeric.DecimalPlaces = 1; + this.visualHispeedNumeric.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.visualHispeedNumeric.Increment = new decimal(new int[] { - 5, + 1, 0, 0, - 131072}); + 65536}); this.visualHispeedNumeric.Location = new System.Drawing.Point(6, 37); this.visualHispeedNumeric.Maximum = new decimal(new int[] { 500, @@ -862,12 +863,13 @@ 1, 0, 0, - 196608}); + 65536}); this.visualHispeedNumeric.Name = "visualHispeedNumeric"; - this.visualHispeedNumeric.Size = new System.Drawing.Size(102, 23); + this.visualHispeedNumeric.Size = new System.Drawing.Size(102, 29); this.visualHispeedNumeric.TabIndex = 11; + this.visualHispeedNumeric.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.visualHispeedNumeric.Value = new decimal(new int[] { - 5, + 15, 0, 0, 65536}); @@ -982,6 +984,16 @@ this.selectLastInsertedNoteToolStripMenuItem.Size = new System.Drawing.Size(233, 22); this.selectLastInsertedNoteToolStripMenuItem.Text = "Select Last Inserted Note"; // + // showGimmicksInCircleViewToolStripMenuItem + // + this.showGimmicksInCircleViewToolStripMenuItem.Checked = true; + 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.Text = "Show Gimmicks In Circle View"; + this.showGimmicksInCircleViewToolStripMenuItem.Click += new System.EventHandler(this.showGimmicksInCircleViewToolStripMenuItem_Click); + // // chartToolStripMenuItem // this.chartToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1392,16 +1404,6 @@ // this.autoSaveTimer.Tick += new System.EventHandler(this.autoSaveTimer_Tick); // - // showGimmicksInCircleViewToolStripMenuItem - // - this.showGimmicksInCircleViewToolStripMenuItem.Checked = true; - 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.Text = "Show Gimmicks In Circle View"; - this.showGimmicksInCircleViewToolStripMenuItem.Click += new System.EventHandler(this.showGimmicksInCircleViewToolStripMenuItem_Click); - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); diff --git a/BAKKA-Editor/MainForm.cs b/BAKKA-Editor/MainForm.cs index 37eb619..7046d24 100644 --- a/BAKKA-Editor/MainForm.cs +++ b/BAKKA-Editor/MainForm.cs @@ -129,6 +129,7 @@ namespace BAKKA_Editor highlightViewedNoteToolStripMenuItem.Checked = userSettings.ViewSettings.HighlightViewedNote; showGimmicksInCircleViewToolStripMenuItem.Checked = userSettings.ViewSettings.ShowGimmicks; selectLastInsertedNoteToolStripMenuItem.Checked = userSettings.ViewSettings.SelectLastInsertedNote; + visualHispeedNumeric.Value = (decimal)userSettings.ViewSettings.HispeedSetting; autoSaveTimer.Interval = userSettings.SaveSettings.AutoSaveInterval * 60000; autoSaveTimer.Enabled = true; // Update hotkey labels @@ -352,6 +353,7 @@ namespace BAKKA_Editor userSettings.ViewSettings.HighlightViewedNote = highlightViewedNoteToolStripMenuItem.Checked; userSettings.ViewSettings.ShowGimmicks = showGimmicksInCircleViewToolStripMenuItem.Checked; userSettings.ViewSettings.SelectLastInsertedNote = selectLastInsertedNoteToolStripMenuItem.Checked; + userSettings.ViewSettings.HispeedSetting = circleView.Hispeed; userSettings.SaveSettings.AutoSaveInterval = autoSaveTimer.Interval / 60000; //Update user settings.toml if (File.Exists("settings.toml")) @@ -540,7 +542,7 @@ namespace BAKKA_Editor circleView.DrawMasks(chart); // Draw base and measure circle. - circleView.DrawCircle(); + circleView.DrawCircle(chart); // Draw degree lines circleView.DrawDegreeLines(); @@ -975,6 +977,8 @@ namespace BAKKA_Editor songTrackBar.Value = 0; songTrackBar.Maximum = (int)currentSong.PlayLength; playButton.Enabled = true; + measureNumeric.Value = 0; + beat1Numeric.Value = 0; } } } @@ -1022,14 +1026,6 @@ namespace BAKKA_Editor measureNumeric.Value = info.Measure; beat1Numeric.Value = (int)((float)info.Beat / 1920.0f * (float)beat2Numeric.Value); circleView.CurrentMeasure = info.MeasureDecimal; - - // TODO Fix hi-speed (it needs to be able to display multiple hi-speeds in the circle view at once) - //// Change hi-speed, if applicable - //var hispeed = chart.Gimmicks.Where(x => x.Measure <= info.Measure && x.GimmickType == GimmickType.HiSpeedChange).LastOrDefault(); - //if (hispeed != null && hispeed.HiSpeed != circleView.TotalMeasureShowNotes) - //{ - // visualHispeedNumeric.Value = (decimal)hispeed.HiSpeed; - //} } circlePanel.Invalidate(); } @@ -1126,7 +1122,7 @@ namespace BAKKA_Editor private void visualHispeedNumeric_ValueChanged(object sender, EventArgs e) { - circleView.TotalMeasureShowNotes = (float)visualHispeedNumeric.Value; + circleView.Hispeed = (float)visualHispeedNumeric.Value; circlePanel.Invalidate(); } diff --git a/BAKKA-Editor/UserSettings.cs b/BAKKA-Editor/UserSettings.cs index 00dcb6b..7bed34a 100644 --- a/BAKKA-Editor/UserSettings.cs +++ b/BAKKA-Editor/UserSettings.cs @@ -20,6 +20,7 @@ namespace BAKKA_Editor public bool HighlightViewedNote { get; set; } = true; public bool SelectLastInsertedNote { get; set; } = true; public bool ShowGimmicks { get; set; } = true; + public float HispeedSetting { get; set; } = 1.5f; } internal class SaveSettings