Exemple #1
0
        protected override void Update()
        {
            if (!Beatmap.Value.TrackLoaded || !Beatmap.Value.BeatmapLoaded)
            {
                return;
            }

            var track   = Beatmap.Value.Track;
            var beatmap = Beatmap.Value.Beatmap;

            if (track == null || beatmap == null)
            {
                return;
            }

            double currentTrackTime = track.Length > 0 ? track.CurrentTime + EarlyActivationMilliseconds : Clock.CurrentTime;

            TimingControlPoint timingPoint = beatmap.ControlPointInfo.TimingPointAt(currentTrackTime);
            EffectControlPoint effectPoint = beatmap.ControlPointInfo.EffectPointAt(currentTrackTime);

            if (timingPoint.BeatLength == 0)
            {
                return;
            }

            int beatIndex = (int)((currentTrackTime - timingPoint.Time) / timingPoint.BeatLength);

            // The beats before the start of the first control point are off by 1, this should do the trick
            if (currentTrackTime < timingPoint.Time)
            {
                beatIndex--;
            }

            TimeUntilNextBeat = (timingPoint.Time - currentTrackTime) % timingPoint.BeatLength;
            if (TimeUntilNextBeat < 0)
            {
                TimeUntilNextBeat += timingPoint.BeatLength;
            }

            TimeSinceLastBeat = timingPoint.BeatLength - TimeUntilNextBeat;

            if (timingPoint.Equals(lastTimingPoint) && beatIndex == lastBeat)
            {
                return;
            }

            using (BeginDelayedSequence(-TimeSinceLastBeat, true))
                OnNewBeat(beatIndex, timingPoint, effectPoint, track.CurrentAmplitudes);

            lastBeat        = beatIndex;
            lastTimingPoint = timingPoint;
        }
        protected override void Update()
        {
            Track    track   = null;
            IBeatmap beatmap = null;

            double             currentTrackTime = 0;
            TimingControlPoint timingPoint      = null;
            EffectControlPoint effectPoint      = null;

            if (Beatmap.Value.TrackLoaded && Beatmap.Value.BeatmapLoaded)
            {
                track   = Beatmap.Value.Track;
                beatmap = Beatmap.Value.Beatmap;
            }

            if (track != null && beatmap != null && track.IsRunning && track.Length > 0)
            {
                currentTrackTime = track.CurrentTime + EarlyActivationMilliseconds;

                timingPoint = beatmap.ControlPointInfo.TimingPointAt(currentTrackTime);
                effectPoint = beatmap.ControlPointInfo.EffectPointAt(currentTrackTime);
            }

            IsBeatSyncedWithTrack = timingPoint?.BeatLength > 0;

            if (timingPoint == null || !IsBeatSyncedWithTrack)
            {
                currentTrackTime = Clock.CurrentTime;
                timingPoint      = defaultTiming;
                effectPoint      = defaultEffect;
            }

            double beatLength = timingPoint.BeatLength / Divisor;

            while (beatLength < MinimumBeatLength)
            {
                beatLength *= 2;
            }

            int beatIndex = (int)((currentTrackTime - timingPoint.Time) / beatLength) - (effectPoint.OmitFirstBarLine ? 1 : 0);

            // The beats before the start of the first control point are off by 1, this should do the trick
            if (currentTrackTime < timingPoint.Time)
            {
                beatIndex--;
            }

            TimeUntilNextBeat = (timingPoint.Time - currentTrackTime) % beatLength;
            if (TimeUntilNextBeat < 0)
            {
                TimeUntilNextBeat += beatLength;
            }

            TimeSinceLastBeat = beatLength - TimeUntilNextBeat;

            if (timingPoint.Equals(lastTimingPoint) && beatIndex == lastBeat)
            {
                return;
            }

            using (BeginDelayedSequence(-TimeSinceLastBeat, true))
                OnNewBeat(beatIndex, timingPoint, effectPoint, track?.CurrentAmplitudes ?? defaultAmplitudes);

            lastBeat        = beatIndex;
            lastTimingPoint = timingPoint;
        }