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); }
public void Send(MIDIEvent[] events) { foreach (MIDIEvent e in events) { var offset = e.time * 1000 - timer.getStopWatch().ElapsedMilliseconds; if (offset > 0) { Thread.Sleep((int)offset); } KDMAPI.SendDirectData(e.data); } }