/// <summary>
        ///     NavigationToNext
        /// </summary>
        /// <param name="karaokeField"></param>
        public static void NavigationToNext(this IAmKaraokeField karaokeField)
        {
            var nowObjectIndex = karaokeField.FindObjectIndexByCurrentTime();
            var list           = karaokeField.GetListHitObjects();

            if (nowObjectIndex < list.Count - 2)
            {
                karaokeField.NavigateToTime(list[nowObjectIndex + 2].StartTime - PrepareTime);
            }
        }
        /// <summary>
        ///     NavigationToPrevious
        /// </summary>
        /// <param name="karaokeField"></param>
        public static void NavigationToPrevious(this IAmKaraokeField karaokeField)
        {
            var nowObjectIndex = karaokeField.FindObjectIndexByCurrentTime();

            if (nowObjectIndex > 1)
            {
                var list = karaokeField.GetListHitObjects();
                karaokeField.NavigateToTime(list[nowObjectIndex - 1].StartTime - PrepareTime);
            }
        }
        /// <summary>
        ///     FindObjectByCurrentTime
        /// </summary>
        /// <param name="karaokeField"></param>
        /// <returns></returns>
        public static HitObject FindObjectByCurrentTime(this IAmKaraokeField karaokeField)
        {
            var currentTime = karaokeField.GetCurrentTime();
            var listObjects = karaokeField.GetListHitObjects();

            for (var i = 0; i < listObjects.Count; i++)
            {
                if (listObjects[i].StartTime >= currentTime + PrepareTime)
                {
                    if (i == 0)
                    {
                        return(null);
                    }

                    return(listObjects[i - 1]);
                }
            }

            return(null);
        }
        /// <summary>
        ///     FindObjectIndexByCurrentTime
        /// </summary>
        /// <param name="karaokeField"></param>
        /// <returns></returns>
        public static int FindObjectIndexByCurrentTime(this IAmKaraokeField karaokeField)
        {
            var hitObject = karaokeField.FindObjectByCurrentTime();

            if (hitObject == null)
            {
                return(-1);
            }

            var listObjects = karaokeField.GetListHitObjects();

            for (var i = 0; i < listObjects.Count; i++)
            {
                if (listObjects[i] == hitObject)
                {
                    return(i);
                }
            }

            //404
            return(-1);
        }
        /// <summary>
        ///     Last object's time
        /// </summary>
        /// <param name="karaokeField"></param>
        /// <returns></returns>
        public static double LastObjectTime(this IAmKaraokeField karaokeField)
        {
            var hitObjects = karaokeField.GetListHitObjects();

            return(((hitObjects.Last() as IHasEndTime)?.EndTime ?? hitObjects.Last().StartTime) + 1);
        }