AlphaSynth.Sequencer.MidiFileSequencer.FillMidiEventQueue C# (CSharp) Метод

FillMidiEventQueue() публичный Метод

public FillMidiEventQueue ( ) : void
Результат void
        public void FillMidiEventQueue()
        {
            if (!IsPlaying || Synth.MidiEventQueue.Length != 0)
                return;
            if (CurrentTime >= EndTime)
            {
                CurrentTime = 0;
                _eventIndex = 0;
                IsPlaying = false;
                Synth.NoteOffAll(true);
                Synth.ResetPrograms();
                Synth.ResetSynthControls();
                FireFinished();
                return;
            }

            var newMSize = (int)(Synth.MicroBufferSize * PlaybackSpeed);
            var endSample = CurrentTime + (newMSize * Synth.MicroBufferCount);
            for (int x = 0; x < Synth.MicroBufferCount; x++)
            {
                CurrentTime += newMSize;
                while (_eventIndex < _synthData.Length && _synthData[_eventIndex].Delta < CurrentTime)
                {
                    if (_synthData[_eventIndex].Event.Command != MidiEventTypeEnum.NoteOn || !_blockList[_synthData[_eventIndex].Event.Channel])
                    {
                        Synth.MidiEventQueue.AddFirst(_synthData[_eventIndex]);
                        Synth.MidiEventCounts[x]++;
                    }
                    _eventIndex++;
                }
            }
        }

Usage Example

Пример #1
0
        public SynthPlayer()
        {
            Logger.Debug("Initializing player");

            State = SynthPlayerState.Stopped;
            OnPlayerStateChanged(new PlayerStateChangedEventArgs(State));

            Logger.Debug("Opening output");
            Output = Platform.Platform.CreateOutput();

            Logger.Debug("Creating synthesizer");
            Synth = new Synthesizer(Output.SampleRate, SynthConstants.AudioChannels, 441, 3, 100);
            Sequencer = new MidiFileSequencer(Synth);

            Sequencer.AddFinishedListener(Output.SequencerFinished);

            Output.Finished += () =>
            {
                // stop everything
                Stop();
                Logger.Debug("Finished playback");
                OnFinished();
            };
            Output.SampleRequest += () =>
            {
                // synthesize buffer
                Sequencer.FillMidiEventQueue();
                Synth.Synthesize();
                // send it to output
                Output.AddSamples(Synth.SampleBuffer);
            };
            Output.PositionChanged += pos =>
            {
                // log position
                FirePositionChanged(pos);
            };

            Output.Open();
        }