public void ProcessMidiEvent(MidiEvent midiEvent)
        {
            if (midiEvent.midiChannelEvent != MidiHelper.MidiChannelEvent.None)
            {
                switch (midiEvent.midiChannelEvent)
                {
                case MidiHelper.MidiChannelEvent.Program_Change:
                    if (midiEvent.channel != 9)
                    {
                        if (midiEvent.parameter1 < synth.SoundBank.InstrumentCount)
                        {
                            currentPrograms[midiEvent.channel] = midiEvent.parameter1;
                        }
                    }
                    else     //its the drum channel
                    {
                        if (midiEvent.parameter1 < synth.SoundBank.DrumCount)
                        {
                            currentPrograms[midiEvent.channel] = midiEvent.parameter1;
                        }
                    }
                    break;

                case MidiHelper.MidiChannelEvent.Note_On:
                    if (blockList.Contains(midiEvent.channel))
                    {
                        return;
                    }
                    if (this.NoteOnEvent != null)
                    {
                        this.NoteOnEvent(midiEvent.channel, midiEvent.parameter1, midiEvent.parameter2);
                    }
                    synth.NoteOn(midiEvent.channel, midiEvent.parameter1, midiEvent.parameter2, currentPrograms[midiEvent.channel]);
                    break;

                case MidiHelper.MidiChannelEvent.Note_Off:
                    if (this.NoteOffEvent != null)
                    {
                        this.NoteOffEvent(midiEvent.channel, midiEvent.parameter1);
                    }
                    synth.NoteOff(midiEvent.channel, midiEvent.parameter1);
                    break;

                case MidiHelper.MidiChannelEvent.Pitch_Bend:
                    //Store PitchBend as the # of semitones higher or lower
                    synth.TunePositions[midiEvent.channel] = (double)midiEvent.Parameters[1] * PitchWheelSemitoneRange;
                    break;

                case MidiHelper.MidiChannelEvent.Controller:
                    switch (midiEvent.GetControllerType())
                    {
                    case MidiHelper.ControllerType.AllNotesOff:
                        synth.NoteOffAll(true);
                        break;

                    case MidiHelper.ControllerType.MainVolume:
                        synth.VolPositions[midiEvent.channel] = midiEvent.parameter2 / 127.0f;
                        break;

                    case MidiHelper.ControllerType.Pan:
                        synth.PanPositions[midiEvent.channel] = (midiEvent.parameter2 - 64) == 63 ? 1.00f : (midiEvent.parameter2 - 64) / 64.0f;
                        break;

                    case MidiHelper.ControllerType.ResetControllers:
                        ResetControllers();
                        break;

                    default:
                        break;
                    }
                    break;

                default:
                    break;
                }
            }
            else
            {
                switch (midiEvent.midiMetaEvent)
                {
                case MidiHelper.MidiMetaEvent.Tempo:
                    _MidiFile.BeatsPerMinute = MidiHelper.MicroSecondsPerMinute / System.Convert.ToUInt32(midiEvent.Parameters[0]);
                    break;

                default:
                    break;
                }
            }
        }