Пример #1
0
        public Spring AddSpring(int start, int duration, float springSize, float preSpringSize)
        {
            Version++;
            Spring spring;

            if (!Springs.ContainsKey(start))
            {
                spring = new Spring();
                spring.TimePosition     = start;
                spring.SmallestDuration = duration;
                spring.LongestDuration  = duration;
                spring.SpringWidth      = springSize;
                spring.PreSpringWidth   = preSpringSize;
                Springs[start]          = spring;
            }
            else
            {
                spring = Springs[start];
                if (spring.SpringWidth < springSize)
                {
                    spring.SpringWidth = springSize;
                }
                if (spring.PreSpringWidth < preSpringSize)
                {
                    spring.PreSpringWidth = preSpringSize;
                }
                if (duration < spring.SmallestDuration)
                {
                    spring.SmallestDuration = duration;
                }
                if (duration > spring.LongestDuration)
                {
                    spring.LongestDuration = duration;
                }
            }

            if (duration < SmallestDuration)
            {
                SmallestDuration = duration;
            }

            return(spring);
        }
Пример #2
0
 private float CalculateSpringConstant(Spring spring, float duration)
 {
     float minDuration = spring.SmallestDuration;
     if (spring.SmallestDuration == 0)
     {
         minDuration = duration;
     }
     var phi = 1 + 0.6f * Std.Log2(duration / (float)MinDuration);
     return (minDuration / duration) * 1 / (phi * MinDurationWidth);
 }
Пример #3
0
        public Spring AddSpring(int start, int duration, float springSize, float preSpringSize)
        {
            Spring spring;
            if (!Springs.ContainsKey(start))
            {
                spring = new Spring();
                spring.TimePosition = start;
                spring.SmallestDuration = duration;
                spring.LongestDuration = duration;
                spring.SpringWidth = springSize;
                spring.PreSpringWidth = preSpringSize;
                Springs[start] = spring;
            }
            else
            {
                spring = Springs[start];
                if (spring.SpringWidth < springSize)
                {
                    spring.SpringWidth = springSize;
                }
                if (spring.PreSpringWidth < preSpringSize)
                {
                    spring.PreSpringWidth = preSpringSize;
                }
                if (duration < spring.SmallestDuration)
                {
                    spring.SmallestDuration = duration;
                }
                if (duration > spring.LongestDuration)
                {
                    spring.LongestDuration = duration;
                }
            }

            if (duration < SmallestDuration)
            {
                SmallestDuration = duration;
            }

            return spring;
        }
Пример #4
0
        public Spring AddSpring(int start, int duration, float preSpringSize, float postSpringSize)
        {
            Version++;
            Spring spring;

            if (!Springs.ContainsKey(start))
            {
                spring = new Spring();
                spring.TimePosition = start;
                spring.AllDurations.Add(duration);

                // check in the previous spring for the shortest duration that overlaps with this spring
                // Gourlay defines that we need the smallest note duration that either starts **or continues** on the current spring.
                if (_timeSortedSprings.Count > 0)
                {
                    int smallestDuration = duration;
                    var previousSpring   = _timeSortedSprings[_timeSortedSprings.Count - 1];
                    foreach (var prevDuration in previousSpring.AllDurations)
                    {
                        var end = previousSpring.TimePosition + prevDuration;
                        if (end >= start && prevDuration < smallestDuration)
                        {
                            smallestDuration = prevDuration;
                        }
                    }
                }
                spring.LongestDuration = duration;
                spring.PostSpringWidth = postSpringSize;
                spring.PreSpringWidth  = preSpringSize;
                Springs[start]         = spring;

                var timeSorted = _timeSortedSprings;
                var insertPos  = timeSorted.Count - 1;
                while (insertPos > 0 && timeSorted[insertPos].TimePosition > start)
                {
                    insertPos--;
                }
                _timeSortedSprings.InsertAt(insertPos + 1, spring);
            }
            else
            {
                spring = Springs[start];
                if (spring.PostSpringWidth < postSpringSize)
                {
                    spring.PostSpringWidth = postSpringSize;
                }
                if (spring.PreSpringWidth < preSpringSize)
                {
                    spring.PreSpringWidth = preSpringSize;
                }
                if (duration < spring.SmallestDuration)
                {
                    spring.SmallestDuration = duration;
                }
                if (duration > spring.LongestDuration)
                {
                    spring.LongestDuration = duration;
                }
                spring.AllDurations.Add(duration);
            }

            if (_minTime > start)
            {
                _minTime = start;
            }

            return(spring);
        }