/// <summary>
        /// Multimedia timer tick handler.
        /// </summary>
        void TimerElapsedEvent(object sender, MmTimerEx.TimerEventArgs e)
        {
            // Kick over to main UI thread.
            BeginInvoke((MethodInvoker) delegate()
            {
                if (_script != null)
                {
                    // Process any events.
                    while (_pmidiEvents.TryDequeue(out PMidiEvent mevt))
                    {
                        _script.midiEvent(mevt);
                    }

                    // Update the view.
                    NextDraw(e);
                }
            });
        }
        /// <summary>
        /// Output next frame.
        /// </summary>
        /// <param name="e">Information about updates required.</param>
        void NextDraw(MmTimerEx.TimerEventArgs e)
        {
            InitRuntime();

            if (e.ElapsedTimers.Contains("UI") && btnPlay.Checked && !_needCompile)
            {
                try
                {
                    _surface.UpdateSurface();
                }
                catch (Exception ex)
                {
                    ScriptRuntimeError(new Surface.RuntimeErrorEventArgs()
                    {
                        Exception = ex
                    });
                }
            }

            // Process whatever the script did.
            ProcessRuntime();
        }