Пример #1
0
        private void OnClockTick(object sender, TickEventArgs e)
        {
            var time = e.Time;

            do
            {
                var playbackEvent = _eventsEnumerator.Current;
                if (playbackEvent == null)
                {
                    continue;
                }

                if (playbackEvent.Time > time)
                {
                    return;
                }

                var midiEvent = playbackEvent.Event;
                if (midiEvent == null)
                {
                    continue;
                }

                if (!IsRunning)
                {
                    return;
                }

                SendEvent(midiEvent);

                var noteMetadata = playbackEvent.Metadata.Note;
                if (noteMetadata != null)
                {
                    if (noteMetadata.IsNoteOnEvent)
                    {
                        _activeNotes[noteMetadata.NoteId] = noteMetadata.Note;
                        OnNotesPlaybackStarted(noteMetadata.Note);
                    }
                    else
                    {
                        _activeNotes.Remove(noteMetadata.NoteId);
                        OnNotesPlaybackFinished(noteMetadata.Note);
                    }
                }
            }while (_eventsEnumerator.MoveNext());

            if (!Loop)
            {
                _clock.Stop();
                OnFinished();
                return;
            }

            _clock.Stop();
            _clock.Reset();
            _eventsEnumerator.Reset();
            _eventsEnumerator.MoveNext();
            _clock.Start();
        }
Пример #2
0
        private void OnClockTick(object sender, TickEventArgs e)
        {
            var time = e.Time;

            do
            {
                var timedEvent = _eventsEnumerator.Current;
                if (timedEvent == null)
                {
                    continue;
                }

                if (timedEvent.Time > time)
                {
                    return;
                }

                var midiEvent = timedEvent.Event;

                if (!IsRunning)
                {
                    return;
                }

                OutputDevice.SendEvent(midiEvent);

                var noteOnEvent = midiEvent as NoteOnEvent;
                if (noteOnEvent != null)
                {
                    _noteOnEvents[noteOnEvent.GetNoteId()] = noteOnEvent;
                }

                var noteOffEvent = midiEvent as NoteOffEvent;
                if (noteOffEvent != null)
                {
                    _noteOnEvents.Remove(noteOffEvent.GetNoteId());
                }
            }while (_eventsEnumerator.MoveNext());

            if (!Loop)
            {
                _clock.Stop();
                OnFinished();
                return;
            }

            _clock.StopInternalTimer();
            _clock.Reset();
            _eventsEnumerator.Reset();
            _eventsEnumerator.MoveNext();
            _clock.StartInternalTimer();
        }
Пример #3
0
        private void OnClockTick(object sender, TickEventArgs e)
        {
            var time = e.Time;

            do
            {
                var playbackEvent = _eventsEnumerator.Current;
                if (playbackEvent == null)
                {
                    continue;
                }

                if (playbackEvent.Time > time)
                {
                    return;
                }

                var midiEvent = playbackEvent.Event;
                if (midiEvent == null)
                {
                    continue;
                }

                if (!IsRunning)
                {
                    return;
                }

                Note note;
                if (TryPlayNoteEvent(playbackEvent, out note))
                {
                    if (note != null)
                    {
                        if (playbackEvent.Event is NoteOnEvent)
                        {
                            OnNotesPlaybackStarted(note);
                        }
                        else
                        {
                            OnNotesPlaybackFinished(note);
                        }
                    }

                    continue;
                }

                var eventCallback = EventCallback;
                if (eventCallback != null)
                {
                    midiEvent = eventCallback(midiEvent.Clone(), playbackEvent.RawTime, time);
                }

                if (midiEvent == null)
                {
                    continue;
                }

                SendEvent(midiEvent);
            }while (_eventsEnumerator.MoveNext());

            if (!Loop)
            {
                _clock.Stop();
                OnFinished();
                return;
            }

            _clock.Stop();
            _clock.Reset();
            _eventsEnumerator.Reset();
            _eventsEnumerator.MoveNext();
            _clock.Start();
        }