Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            }
        }