Exemplo n.º 1
0
        private static double getClosestSnappedTime(TimingControlPoint timingPoint, double time, int beatDivisor)
        {
            var beatLength  = timingPoint.BeatLength / beatDivisor;
            var beatLengths = (int)Math.Round((time - timingPoint.Time) / beatLength, MidpointRounding.AwayFromZero);

            return(timingPoint.Time + beatLengths * beatLength);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Returns the beat snap divisor closest to the given time. If two are equally close, the smallest divisor is returned.
        /// </summary>
        /// <param name="time">The time to find the closest beat snap divisor to.</param>
        /// <param name="referenceTime">An optional reference point to use for timing point lookup.</param>
        public int GetClosestBeatDivisor(double time, double?referenceTime = null)
        {
            TimingControlPoint timingPoint = TimingPointAt(referenceTime ?? time);

            int    closestDivisor = 0;
            double closestTime    = double.MaxValue;

            foreach (int divisor in BindableBeatDivisor.VALID_DIVISORS)
            {
                double distanceFromSnap = Math.Abs(time - getClosestSnappedTime(timingPoint, time, divisor));

                if (Precision.DefinitelyBigger(closestTime, distanceFromSnap))
                {
                    closestDivisor = divisor;
                    closestTime    = distanceFromSnap;
                }
            }

            return(closestDivisor);
        }