Esempio n. 1
0
        private void ReadMidiEvent(Track track, MidiEvent e, byte type, int ptr, out int varlen)
        {
            byte ctrlMsg = (byte)(type >> 4);
            byte channel = (byte)(type & 0xF);

            e.midiChannel = channel;
            byte note     = 0;
            byte velocity = 0;

            switch (ctrlMsg)
            {
            // read two bytes
            case 8:
                note     = buffer[ptr + 1];
                velocity = buffer[ptr + 2];
                sb.AppendFormat("Note Off Channel: {0,2}, Note: {1,3}, Velocity: {2,3}", channel, note, velocity).AppendLine();
                varlen = 2;
                e.note = note;
                e.type = METype.noteoff;
                events.Add(e);
                break;

            case 9:
                note     = buffer[ptr + 1];
                velocity = buffer[ptr + 2];
                sb.AppendFormat("Note On  Channel: {0,2}, Note: {1,3}, Velocity: {2,3}", channel, note, velocity).AppendLine();
                varlen     = 2;
                e.note     = note;
                e.velocity = velocity;
                events.Add(e);
                break;

            case 0xA:
                note     = buffer[ptr + 1];
                velocity = buffer[ptr + 2];
                sb.AppendFormat("Poly AT  Channel: {0,2}, Note: {1,3}, Velocity: {2,3}", channel, note, velocity).AppendLine();
                varlen = 2;
                break;

            case 0xB:
                byte ctrlr = buffer[ptr + 1];
                byte value = buffer[ptr + 2];
                sb.AppendFormat("Control  Channel: {0,2}, Note: {1,3}, Velocity: {2,3}", channel, note, velocity).AppendLine();
                varlen = 2;
                break;

            case 0xE:
                short pwValue = (short)((buffer[ptr + 1] << 7) + buffer[ptr + 2]);
                sb.AppendFormat("Pitch Bd Channel: {0,2}, Value: {1,4}", channel, pwValue).AppendLine();
                varlen = 2;
                break;

            // read one byte
            case 0xC:
                byte program = buffer[ptr + 1];
                sb.AppendFormat("Prog Chg Channel: {0,2}, Program: {1,3}", channel, program).AppendLine();
                varlen    = 1;
                e.type    = METype.progchange;
                e.program = program;
                events.Add(e);
                break;

            case 0xD:
                byte pressure = buffer[ptr + 1];
                sb.AppendFormat("Chnl Prs Channel: {0,2}, Pressure: {1,3}", channel, pressure).AppendLine();
                varlen = 1;
                break;

            default:
                varlen = 0;
                break;
            }
        }
Esempio n. 2
0
        private int ReadEvents(Track track, int ptr, int length)
        {
            int offset    = 0;
            int totalTime = 0;

            while (offset < length)
            {
                // Read the variable-length delta time
                int deltatime = ReadVarInt(ptr + offset, out int varlen);
                totalTime += deltatime;


                MidiEvent ev = new MidiEvent()
                {
                    deltaTime = deltatime,
                    wait      = samplesPerTick * deltatime,
                    index     = totalTime
                };
                sb.AppendFormat("{0,6} {1,6} {2,6} ", ev.index, ev.deltaTime, ev.wait);

                offset += varlen;
                byte EventType = buffer[ptr + offset];
                if ((EventType & 0x80) == 0)
                {
                    EventType = RunningStatus;
                    offset--;
                }
                else
                {
                    RunningStatus = EventType;
                }
                switch (EventType)
                {
                case 0xFF:
                    // Meta
                    byte metaType   = buffer[ptr + offset + 1];
                    int  metaLength = ReadVarInt(ptr + offset + 2, out varlen);
                    offset += varlen + 2;
                    // do stuff
                    ReadMeta(track, metaType, metaLength, ptr + offset);
                    // prepare to read the next event
                    offset += metaLength;
                    break;

                case 0xF0:
                case 0xF7:
                    // system exclusive message
                    int sysexLength = ReadVarInt(ptr + offset + 1, out varlen);
                    sb.Append("System Exclusive Event: ").Append(EventType).Append(", Length: ").Append(sysexLength).Append(Environment.NewLine);
                    offset += varlen + 1;
                    // do stuff

                    // prepare to read the next event
                    offset += sysexLength;
                    break;

                default:
                    // MIDI message
                    ReadMidiEvent(track, ev, EventType, ptr + offset, out varlen);
                    offset += varlen + 1;
                    break;
                }
            }
            return(totalTime);
        }