コード例 #1
0
ファイル: SMF.cs プロジェクト: richardlalancette/managed-midi
 public static int GetPlayTimeMillisecondsAtTick(IList <MidiMessage> messages, int ticks, int deltaTimeSpec)
 {
     if (deltaTimeSpec < 0)
     {
         throw new NotSupportedException("non-tick based DeltaTime");
     }
     else
     {
         int    tempo = MidiMetaType.DefaultTempo;
         int    t     = 0;
         double v     = 0;
         foreach (var m in messages)
         {
             var deltaTime = t + m.DeltaTime < ticks ? m.DeltaTime : ticks - t;
             v += (double)tempo / 1000 * deltaTime / deltaTimeSpec;
             if (deltaTime != m.DeltaTime)
             {
                 break;
             }
             t += m.DeltaTime;
             if (m.Event.EventType == MidiEvent.Meta && m.Event.Msb == MidiMetaType.Tempo)
             {
                 tempo = MidiMetaType.GetTempo(m.Event.ExtraData, m.Event.ExtraDataOffset);
             }
         }
         return((int)v);
     }
 }
コード例 #2
0
ファイル: MidiPlayer.cs プロジェクト: jamesdlow/managed-midi
        void ProcessMessage(MidiMessage m)
        {
            if (seek_processor != null)
            {
                var result = seek_processor.FilterMessage(m);
                switch (result)
                {
                case SeekFilterResult.PassAndTerminate:
                case SeekFilterResult.BlockAndTerminate:
                    seek_processor = null;
                    break;
                }

                switch (result)
                {
                case SeekFilterResult.Block:
                case SeekFilterResult.BlockAndTerminate:
                    return;                     // ignore this event
                }
            }
            else if (m.DeltaTime != 0)
            {
                var ms = GetContextDeltaTimeInMilliseconds(m.DeltaTime);
                time_manager.WaitBy(ms);
                play_delta_time += m.DeltaTime;
            }

            if (m.Event.StatusByte == 0xFF)
            {
                if (m.Event.Msb == MidiMetaType.Tempo)
                {
                    current_tempo = MidiMetaType.GetTempo(m.Event.Data);
                }
                else if (m.Event.Msb == MidiMetaType.TimeSignature && m.Event.Data.Length == 4)
                {
                    Array.Copy(m.Event.Data, current_time_signature, 4);
                }
            }

            OnEvent(m.Event);
        }
コード例 #3
0
 public static int GetTotalPlayTimeMilliseconds(IList <MidiMessage> messages, int deltaTimeSpec)
 {
     if (deltaTimeSpec < 0)
     {
         throw new NotSupportedException("non-tick based DeltaTime");
     }
     else
     {
         int tempo = MidiMetaType.DefaultTempo;
         int v     = 0;
         foreach (var m in messages)
         {
             v += (int)(tempo / 1000 * m.DeltaTime / deltaTimeSpec);
             if (m.Event.EventType == MidiEvent.Meta && m.Event.Msb == MidiMetaType.Tempo)
             {
                 tempo = MidiMetaType.GetTempo(m.Event.Data);
             }
         }
         return(v);
     }
 }
コード例 #4
0
ファイル: MidiPlayer.cs プロジェクト: noname22/managed-midi
        public virtual void HandleEvent(MidiMessage m)
        {
            if (m.DeltaTime != 0)
            {
                var ms = GetDeltaTimeInMilliseconds(m.DeltaTime);
                time_manager.AdvanceBy(ms);
            }
            if (m.Event.StatusByte == 0xFF)
            {
                if (m.Event.Msb == MidiMetaType.Tempo)
                {
                    current_tempo = MidiMetaType.GetTempo(m.Event.Data);
                }
                else if (m.Event.Msb == MidiMetaType.TimeSignature && m.Event.Data.Length == 4)
                {
                    Array.Copy(m.Event.Data, current_time_signature, 4);
                }
            }

            OnEvent(m.Event);
            PlayDeltaTime += m.DeltaTime;
        }