public override string ToString() { return("MIDIEvent: " + MIDIEvent.ToString() + " - TimeBeats: " + TimeBeats + " - DurationBeats: " + DurationBeats); }
/// <summary> /// イベントごとのリストを生成する。 /// その際、複数のトラックのデータをシーケンシャルな並びのイベントデータにまとめる /// </summary> private List <MIDIEvent> GetSeqEvent(byte[] buff) { List <MIDIEvent> ret = new List <MIDIEvent>(); bool end; int minDelta; do { MIDIEvent lastEvent = null; foreach (Track trk in tracks) { if (trk.endFlg) { continue; } if (trk.deltaCounter > 0) { continue; } if (trk.ptr == trk.startAdr + 4 + 4) { trk.deltaCounter = GetDelta(buff, ref trk.ptr); } //deltaCounterが0の間、イベントを読み込む while (trk.deltaCounter == 0) { Tuple <byte, byte[]> evnt = GetEvents(buff, ref trk.ptr); lastEvent = new MIDIEvent(tickCounter, 0, evnt.Item1, evnt.Item2); ret.Add(lastEvent); #if DEBUG Console.WriteLine(lastEvent.ToString()); #endif //最後まで読み込んだのであれば、このトラックの解析は完了 if (trk.ptr >= trk.endAdr) { trk.endFlg = true; break; } trk.deltaCounter = GetDelta(buff, ref trk.ptr); } } //全てのトラックの終了をチェック&最小デルタチェック end = true; minDelta = int.MaxValue; foreach (Track trk in tracks) { if (trk.endFlg) { continue; } end = false; minDelta = Math.Min(minDelta, trk.deltaCounter); } if (lastEvent != null) { lastEvent.tickLength = minDelta; #if DEBUG Console.WriteLine("lastEvent: {0}", lastEvent); #endif } //カウンターの更新 tickCounter += minDelta; foreach (Track trk in tracks) { if (trk.endFlg) { continue; } trk.deltaCounter -= minDelta; } } while (!end); return(ret); }