/// <summary> /// Parse all tracks to (vst) mididatalist and our internal delegation. /// </summary> public void ParseAll() { MidiVSTMessageList.Clear(); TrackLength.Clear(); for (int i = 0; i < FileHandle.NumberOfTracks; i++) { MidiVSTMessageList.CreateKey(i); TrackLength.Add(-1); } CurrentTrackPulse = 0; lock (ParseAllLock) { for (int nTrackIndex = 0; nTrackIndex < FileHandle.NumberOfTracks; nTrackIndex++) { ResetTrackTiming(); selectedTrackNumber = nTrackIndex; // without triggering the event. long delta = 0; int nTrackOffset = 0; do { nTrackOffset = FileHandle.ReadDelta(nTrackIndex, nTrackOffset, out delta); CurrentTrackPulse += delta; nTrackOffset = GetNTrackMessage(nTrackIndex, nTrackOffset, Convert.ToInt32(delta)); }while (nTrackOffset < FileHandle.Tracks[nTrackIndex].Data.Length); TrackLength[nTrackIndex] = CurrentTrackPulse; } } }
internal void ResetTempoMap() { TempoMap.Clear(); SMPTE.Reset(); TimeSignature.Reset(); KeySignature.Reset(); MidiMessages.Clear(); MidiVSTMessageList.Clear(); }
void VSTMessageListHandler(MidiMsgType msgType, int nTrackIndex, int nTrackOffset, int midiMsg32, byte midiMsg8, long pulse, int delta, bool isRunningStatus) { switch (msgType) { case MidiMsgType.MetaStr: MidiVSTMessageList.AddV(nTrackIndex, new MetaMessageVST(MidiMsgType.MetaStr, pulse, midiMsg32, GetMetadataBytes(nTrackIndex, nTrackOffset))); break; case MidiMsgType.MetaInf: byte[] bytes = GetMetadataBytes(nTrackIndex, nTrackOffset); var midiMsg = new MetaMessageVST(pulse, midiMsg32, bytes); MidiVSTMessageList.AddV(nTrackIndex, midiMsg); break; case MidiMsgType.SystemExclusive: Debug.WriteLine("Skip System Exclusive Message (for now)"); break; case MidiMsgType.ChannelVoice: case MidiMsgType.NoteOff: case MidiMsgType.NoteOn: MidiVSTMessageList.AddV(nTrackIndex, new ChannelMessageVST(pulse, midiMsg32, GetEventValue(nTrackIndex, nTrackOffset + 1))); break; case MidiMsgType.SequencerSpecific: MidiVSTMessageList.AddV(nTrackIndex, new SequencerSpecificVST(pulse, midiMsg32, GetEventValue(nTrackIndex, nTrackOffset + 1))); break; case MidiMsgType.SequencerSpecificUnknown: MidiVSTMessageList.AddV(nTrackIndex, new SequencerSpecificUnkn((ushort)midiMsg32, pulse, midiMsg32, GetEventValue(nTrackIndex, nTrackOffset + 1))); break; case MidiMsgType.EOT: MidiVSTMessageList.AddV(nTrackIndex, new MetaMessageVST(pulse, midiMsg32)); break; default: if (isRunningStatus) { MidiVSTMessageList.AddV(nTrackIndex, new ChannelMessageVST(pulse, delta, GetEventValue(nTrackIndex, nTrackOffset))); } else { MidiVSTMessageList.AddV(nTrackIndex, new ChannelMessageVST(pulse, delta, GetEventValue(nTrackIndex, nTrackOffset + 1))); } break; } }