Symphonary.MidiPlayer.HandleChannelMessagePlayed C# (CSharp) Method

HandleChannelMessagePlayed() private method

Internal event handler for channel message played
private HandleChannelMessagePlayed ( object sender, Sanford.Multimedia.Midi.ChannelMessageEventArgs e ) : void
sender object
e Sanford.Multimedia.Midi.ChannelMessageEventArgs
return void
        private void HandleChannelMessagePlayed(object sender, ChannelMessageEventArgs e)
        {
            if (b_ProgramClosing) // don't try playing anything if program is closing
                return;

            // always play NoteOff messages
            if (e.Message.Command == ChannelCommand.NoteOn && e.Message.Data2 > 0)
            {
                if (!PlayOtherChannels && e.Message.MidiChannel != i_PersistentChannel)
                    return;

                if (!PlayPersistentChannel && e.Message.MidiChannel == i_PersistentChannel)
                    return;
            }

            if (e.Message.MidiChannel == i_PersistentChannel)
            {
                if (e.Message.Command == ChannelCommand.NoteOn && e.Message.Data2 > 0)
                {
                    i_NumChannelNotesPlayed++;
                    al_CurrentPlayingChannelNotes.Add(e.Message.Data1 + NoteOffset);
                    e = new ChannelMessageEventArgs(new ChannelMessage(e.Message.Command, e.Message.MidiChannel, e.Message.Data1 + NoteOffset, e.Message.Data2));
                }
                else if (e.Message.Command == ChannelCommand.NoteOn || e.Message.Command == ChannelCommand.NoteOff)
                {
                    al_CurrentPlayingChannelNotes.Remove(e.Message.Data1 + NoteOffset);
                    e = new ChannelMessageEventArgs(new ChannelMessage(e.Message.Command, e.Message.MidiChannel, e.Message.Data1 + NoteOffset, e.Message.Data2));
                }
            }

            outputDevice.Send(e.Message);
        }