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