public double ToMilliSeconds(double tick)
        {
            if (_tick != null && _tick.Value == tick)
            {
                return(_toMilliSecCache);
            }
            if (tick < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(tick));
            }
            ScoreTempo scoreTempo = TempoMap.FindLast(obj => obj.Tick <= tick);

            _tick = tick;
            return(_toMilliSecCache = scoreTempo.MilliSeconds + GetMilliSeconds(tick - scoreTempo.Tick, scoreTempo.Tempo, _resolution));
        }
        public double ToTick(double msec)
        {
            if (_msec != null && _msec.Value == msec)
            {
                return(_toTickCache);
            }
            if (msec < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(msec));
            }
            ScoreTempo scoreTempo = TempoMap.FindLast(obj => obj.MilliSeconds <= msec);

            _msec = msec;
            return(_toTickCache = scoreTempo.Tick + GetTickLength(msec - scoreTempo.MilliSeconds, scoreTempo.Tempo, _resolution));
        }
        private void ResetTempoMap()
        {
            var st   = new ScoreTempo(0, 0, 120);
            var list = new List <ScoreTempo>();

            list.Add(st);
            foreach (TempoEvent current in (from me in Events
                                            where me is TempoEvent
                                            select me as TempoEvent))
            {
                var msec = st.MilliSeconds + GetMilliSeconds((int)(current.Tick - st.Tick), st.Tempo, _resolution);
                st = new ScoreTempo(msec, (int)current.Tick, current.Tempo);
                list.Add(st);
            }
            TempoMap = list;
        }