protected override void OnKeyDown(KeyboardKeyEventArgs e) { base.OnKeyDown(e); if (e.Key == Key.Space && !settings.ffRender) { settings.Paused = !settings.Paused; } if (e.Key == Key.Right && !settings.ffRender) { int skip = settings.skip; if (e.Modifiers == KeyModifiers.Control) { skip += 20000; } if (e.Modifiers == KeyModifiers.Shift) { skip += 60000; } if (settings.timeBasedNotes) { midiTime += skip; } else { lock (midi) { double timeSkipped = 0; for (; timeSkipped < skip; ++midiTime) { midi.ParseUpTo(midiTime); timeSkipped += 1 / midi.tempoTickMultiplier; } } Task.Run(() => { Console.WriteLine("Resetting KDMAPI Stream..."); try { KDMAPI.ResetKDMAPIStream(); Console.WriteLine("Done"); } catch { Console.WriteLine("Failed to reset KDMAPI Stream."); } }); } } if (e.Key == Key.Enter) { if (WindowState != WindowState.Fullscreen) { WindowState = WindowState.Fullscreen; } else { WindowState = WindowState.Normal; } } }
void PlaybackLoop() { PlaybackEvent pe; int timeJump; long now; playbackLoopStarted = true; if (settings.ffRender) { return; } if (settings.Paused || !settings.playbackEnabled) { SpinWait.SpinUntil(() => !(settings.Paused || !settings.playbackEnabled)); } KDMAPI.ResetKDMAPIStream(); KDMAPI.SendDirectData(0x0); while (settings.running) { if (settings.Paused || !settings.playbackEnabled) { SpinWait.SpinUntil(() => !(settings.Paused || !settings.playbackEnabled)); } try { if (globalPlaybackEvents.ZeroLen) { continue; } pe = globalPlaybackEvents.Pop(); now = DateTime.Now.Ticks; if (now - 10000000 > frameStartTime) { SpinWait.SpinUntil(() => now - 10000000 < frameStartTime); } timeJump = (int)(((pe.pos - midiTime) * microsecondsPerTick / settings.tempoMultiplier - now + frameStartTime) / 10000); if (timeJump < -1000) { continue; } if (timeJump > 0) { Thread.Sleep(timeJump); } if (settings.playSound && settings.playbackEnabled) { try { KDMAPI.SendDirectData((uint)pe.val); } catch { continue; } } } catch { continue; } } KDMAPI.ResetKDMAPIStream(); KDMAPI.SendDirectData(0x0); }