コード例 #1
0
        /// <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;
                }
            }
        }
コード例 #2
0
        internal void ResetTempoMap()
        {
            TempoMap.Clear();
            SMPTE.Reset();
            TimeSignature.Reset();
            KeySignature.Reset();

            MidiMessages.Clear();
            MidiVSTMessageList.Clear();
        }
コード例 #3
0
        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;
            }
        }