Ejemplo n.º 1
0
        /// <summary>Parse a voice event from the data stream.</summary>
        /// <param name="deltaTime">The previously parsed delta-time for this event.</param>
        /// <param name="messageType">The previously parsed type of message we're expecting to find.</param>
        /// <param name="channel">The previously parsed channel for this message.</param>
        /// <param name="data">The data stream from which to read the event information.</param>
        /// <param name="pos">The position of the start of the event information.</param>
        /// <returns>The parsed voice MIDI event.</returns>
        private static MidiEvent ParseVoiceEvent(long deltaTime, byte messageType, byte channel, byte [] data, ref long pos)
        {
            try
            {
                MidiEvent tempEvent = null;

                // Create the correct voice event based on its message id/type
                switch(messageType)
                {
                        // NOTE OFF
                    case 0x8:
                        tempEvent = new NoteOff(deltaTime, channel, data[pos], data[pos+1]);
                        pos += 2;
                        break;

                        // NOTE ON
                    case 0x9:
                        tempEvent = new NoteOn(deltaTime, channel, data[pos], data[pos+1]);
                        pos += 2;
                        break;

                        // AFTERTOUCH
                    case 0xA:
                        tempEvent = new Aftertouch(deltaTime, channel, data[pos], data[pos+1]);
                        pos += 2;
                        break;

                        // CONTROLLER
                    case 0xB:
                        tempEvent = new Controller(deltaTime, channel, data[pos], data[pos+1]);
                        pos += 2;
                        break;

                        // PROGRAM CHANGE
                    case 0xC:
                        tempEvent = new ProgramChange(deltaTime, channel, data[pos]);
                        pos += 1;
                        break;

                        // CHANNEL PRESSURE
                    case 0xD:
                        tempEvent = new ChannelPressure(deltaTime, channel, data[pos]);
                        pos += 1;
                        break;

                        // PITCH WHEEL
                    case 0xE:
                        int position = ((data[pos] << 8) | data[pos+1]);
                        byte upper, lower;
                        MidiEvent.Split14BitsToBytes(position, out upper, out lower);
                        tempEvent = new PitchWheel(deltaTime, channel, upper, lower);
                        pos += 2;
                        break;

                        // UH OH!
                    default: throw new ArgumentOutOfRangeException("messageType", messageType, "Not a voice message.");
                }

                // Return the newly parsed event
                return tempEvent;
            }
                // Something bad happened; wrap it in a parser exception
            catch(Exception exc) { throw new MidiParserException("Unable to parse voice MIDI event.", exc, pos); }
        }
        private static MidiEvent ParseVoiceEvent(long deltaTime, byte messageType, byte channel, byte[] data, ref long pos)
        {
            MidiEvent event3;
            try
            {
                MidiEvent event2 = null;
                switch (messageType)
                {
                    case 8:
                        event2 = new NoteOff(deltaTime, channel, data[(int) ((IntPtr) pos)], data[(int) ((IntPtr) (pos + 1L))]);
                        pos += 2L;
                        break;

                    case 9:
                        event2 = new NoteOn(deltaTime, channel, data[(int) ((IntPtr) pos)], data[(int) ((IntPtr) (pos + 1L))]);
                        pos += 2L;
                        break;

                    case 10:
                        event2 = new Aftertouch(deltaTime, channel, data[(int) ((IntPtr) pos)], data[(int) ((IntPtr) (pos + 1L))]);
                        pos += 2L;
                        break;

                    case 11:
                        event2 = new Controller(deltaTime, channel, data[(int) ((IntPtr) pos)], data[(int) ((IntPtr) (pos + 1L))]);
                        pos += 2L;
                        break;

                    case 12:
                        event2 = new ProgramChange(deltaTime, channel, data[(int) ((IntPtr) pos)]);
                        pos += 1L;
                        break;

                    case 13:
                        event2 = new ChannelPressure(deltaTime, channel, data[(int) ((IntPtr) pos)]);
                        pos += 1L;
                        break;

                    case 14:
                    {
                        byte num2;
                        byte num3;
                        int bits = (data[(int) ((IntPtr) pos)] << 8) | data[(int) ((IntPtr) (pos + 1L))];
                        MidiEvent.Split14BitsToBytes(bits, out num2, out num3);
                        event2 = new PitchWheel(deltaTime, channel, num2, num3);
                        pos += 2L;
                        break;
                    }
                    default:
                        throw new ArgumentOutOfRangeException("messageType", messageType, "Not a voice message.");
                }
                event3 = event2;
            }
            catch (Exception exception)
            {
                throw new MidiParserException("Unable to parse voice MIDI event.", exception, pos);
            }
            return event3;
        }