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; } }
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); }