public virtual PlaybackSpeed AutoAdjust(PlaybackSpeed track, double targetBpm)
        {
            if (track == null) throw new ArgumentNullException("track");

            if (track.IsUnknownBpm || Double.IsNaN(targetBpm))
                return track;

            double increase = CalculateSuggestedIncrease(track, targetBpm);

            return track.AsIncreasedBy(increase);
        }
        public Transition GetTransitionBetween(PlaybackSpeed first, PlaybackSpeed second)
        {
            if (first == null) throw new ArgumentNullException("first");
            if (second == null) throw new ArgumentNullException("second");

            // Adjust playback speed to match
            var suggestedSpeedIncrease = playbackSpeedAdjuster.CalculateSuggestedIncrease(first, second);
            var secondAdjusted = second.AsIncreasedBy(suggestedSpeedIncrease);

            var strategy = preferredStrategies.FirstOrDefault(s => s.IsCompatible(first, secondAdjusted));
            if (strategy == null)
                return null;

            return new Transition(
                first.ActualKey, 
                secondAdjusted.ActualKey, 
                strategy, 
                suggestedSpeedIncrease);
        }