Exemple #1
0
 public override string ToString()
 {
     return("MIDIEvent: " + MIDIEvent.ToString() + " - TimeBeats: " + TimeBeats + " - DurationBeats: " + DurationBeats);
 }
Exemple #2
0
        /// <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);
        }