Exemple #1
0
 public void Increment(IHasDuration appDur)
 {
     lock (_sync)
     {
         DurationHolder = appDur;
     }
 }
        public static IEnumerable <BosuHitObject> ConvertSpinner(double startTime, IHasDuration endTime, double beatLength)
        {
            // Fast bpm spinners are almost impossible to pass, nerf them.
            if (beatLength < 400)
            {
                while (beatLength < 400)
                {
                    beatLength *= 2f;
                }
            }

            var spansPerSpinner = endTime.Duration / beatLength;

            for (int i = 0; i < spansPerSpinner; i++)
            {
                var spinnerProgress = i / spansPerSpinner;

                for (int j = 0; j < bullets_per_spinner_span; j++)
                {
                    var rotationsPerSpinner = endTime.Duration / spinner_rotation_duration;
                    var angle          = (float)(((float)j / bullets_per_spinner_span * 360) + (spinnerProgress * rotationsPerSpinner * 360));
                    var originPosition = new Vector2(BosuPlayfield.BASE_SIZE.X / 2f, BosuPlayfield.BASE_SIZE.Y / 4f);

                    var rotatedXPos = originPosition.X + (spinner_ring_distance * Math.Sin(angle * Math.PI / 180));
                    var rotatedYPos = originPosition.Y + (spinner_ring_distance * -Math.Cos(angle * Math.PI / 180));

                    yield return(new AngeledCherry
                    {
                        Angle = angle,
                        StartTime = startTime + spinnerProgress * endTime.Duration,
                        Position = new Vector2((float)rotatedXPos, (float)rotatedYPos),
                    });
                }
            }
        }
        public override string ParseBack(Model.Score score)
        {
            if (score == null)
            {
                throw new ArgumentNullException("Score cannot be null.");
            }

            StringBuilder sb = new StringBuilder();
            IHasDuration  previousElement = null;

            foreach (Staff staff in score.Staves)
            {
                foreach (var element in staff.Elements.Where(el => el is IHasDuration || el is Barline))
                {
                    if (element is Barline && IncludeBarlines)
                    {
                        sb.Append("| ");
                        continue;
                    }
                    IHasDuration durationElement = element as IHasDuration;
                    if (durationElement == null)
                    {
                        continue;
                    }

                    if (previousElement != null)
                    {
                        int    greaterDuration;
                        int    lesserDuration;
                        string sign;
                        if (previousElement.BaseDuration <= durationElement.BaseDuration)
                        {
                            greaterDuration = (int)durationElement.BaseDuration.Denominator;
                            lesserDuration  = (int)previousElement.BaseDuration.Denominator;
                            sign            = "*";
                        }
                        else
                        {
                            lesserDuration  = (int)durationElement.BaseDuration.Denominator;
                            greaterDuration = (int)previousElement.BaseDuration.Denominator;
                            sign            = "/";
                        }
                        sb.Append(sign);
                        sb.Append(greaterDuration / lesserDuration);
                    }
                    for (int i = 0; i < durationElement.NumberOfDots; i++)
                    {
                        sb.Append(".");
                    }
                    if (element is Rest && MarkRests)
                    {
                        sb.Append("r");
                    }
                    previousElement = durationElement;
                    sb.Append(" ");
                }
            }
            return(sb.ToString().Trim());
        }
Exemple #4
0
 public static TimeSpan DurationToTime(IHasDuration durationElement, Tempo tempo)
 {
     double singleNoteDuration = 60d / tempo.BeatsPerMinute;
     double ratio = (double)tempo.BeatUnit.Denominator / (double)durationElement.BaseDuration.Denominator;
     if (durationElement.NumberOfDots > 0)
     {
         ratio += ratio * Math.Pow(0.5, durationElement.NumberOfDots);
     }
     return TimeSpan.FromSeconds(singleNoteDuration * ratio);
 }
Exemple #5
0
 public void Release()
 {
     lock (_sync)
     {
         if (DurationHolder == null)
         {
             return;
         }
         DurationHolder.Duration -= _ticked;
         _ticked        = TimeSpan.Zero;
         DurationHolder = null;
     }
 }
        public override double[] ParseBack(Score score) //TODO: Dokończyć
        {
            List <double> digest                = new List <double>();
            int           timeSignatureBase     = 4;
            double        remainingRhythmicPart = 0;

            foreach (Staff staff in score.Staves)
            {
                foreach (var element in staff.Elements)
                {
                    TimeSignature timeSignature = element as TimeSignature;
                    if (timeSignature != null)
                    {
                        timeSignatureBase = (int)timeSignature.TypeOfBeats;
                        continue;
                    }
                    IHasDuration rhythmicElement = element as IHasDuration;
                    if (rhythmicElement == null)
                    {
                        continue;
                    }

                    double fractionOfMeasure = timeSignatureBase / (double)rhythmicElement.BaseDuration.Denominator;
                    if (rhythmicElement.NumberOfDots > 0)
                    {
                        fractionOfMeasure += fractionOfMeasure * (1 / Math.Pow(2, rhythmicElement.NumberOfDots));
                    }
                    //TODO: Obsłużyć też wiązanie nut łukami

                    int numberOfPartsOccupied = (int)Math.Ceiling(fractionOfMeasure);
                    while (fractionOfMeasure > 0)
                    {
                        remainingRhythmicPart = 1 / fractionOfMeasure;
                        digest.Add(remainingRhythmicPart);
                        fractionOfMeasure -= 1;
                    }
                }
            }
            return(digest.ToArray());
        }
        public TaikoSpanPlacementBlueprint(HitObject hitObject)
            : base(hitObject)
        {
            spanPlacementObject = hitObject as IHasDuration;

            RelativeSizeAxes = Axes.Both;

            InternalChildren = new Drawable[]
            {
                headPiece = new HitPiece
                {
                    Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT)
                },
                lengthPiece = new LengthPiece
                {
                    Height = TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT
                },
                tailPiece = new HitPiece
                {
                    Size = new Vector2(TaikoHitObject.DEFAULT_SIZE * TaikoPlayfield.DEFAULT_HEIGHT)
                }
            };
        }
        public override string ParseBack(Model.Score score)
        {
            if (score == null)
            {
                throw new ArgumentNullException("Score");
            }

            StringBuilder sb = new StringBuilder();

            foreach (Staff staff in score.Staves)
            {
                foreach (var element in staff.Elements.Where(el => el is IHasDuration || el is Barline))
                {
                    if (element is Barline && IncludeBarlines)
                    {
                        sb.Append("| ");
                        continue;
                    }
                    IHasDuration durationElement = element as IHasDuration;
                    if (durationElement == null)
                    {
                        continue;
                    }
                    sb.Append((int)durationElement.BaseDuration.Denominator);
                    for (int i = 0; i < durationElement.NumberOfDots; i++)
                    {
                        sb.Append(".");
                    }
                    if (element is Rest && MarkRests)
                    {
                        sb.Append("r");
                    }
                    sb.Append(" ");
                }
            }
            return(sb.ToString().Trim());
        }
Exemple #9
0
        private void FetchNextElement(object state)
        {
            try
            {
                if (ShouldRestart)
                {
                    CurrentElement = null;
                    Enumerator     = null;
                    ShouldRestart  = false;
                }

                TimerState timerState = state as TimerState;
                if (timerState == null)
                {
                    return;
                }
                if (timerState.CancellationToken)
                {
                    return;
                }
                if (timerState.Score == null)
                {
                    return;
                }
                Staff staff = timerState.Score.Staves.FirstOrDefault();
                if (staff == null)
                {
                    return;
                }

                if (Enumerator == null)
                {
                    Enumerator = staff.Elements.GetEnumerator();
                }
                if (!Enumerator.MoveNext())
                {
                    Stop();
                    return;
                }
                CurrentElement = Enumerator.Current;

                NoteOrRest noteOrRest = GetCurrentNoteOrRestAndDetermineTupletState(staff);
                if (ProcessGraceNotesAndChordElements(staff))
                {
                    FetchNextElement(timerState);
                    return;
                }

                //
                // Determine duration == next note start time
                //
                IHasDuration durationElement = CurrentElement as IHasDuration;
                if (durationElement != null)
                {
                    double dueTime = MusicalSymbol.DurationToTime(durationElement, Tempo).TotalMilliseconds;
                    if (TupletState != null)
                    {
                        dueTime = dueTime / TupletState.NumberOfNotesUnderTuplet * ((double)durationElement.BaseDuration.Denominator / (double)Tempo.BeatUnit.Denominator);
                    }
                    Debug.WriteLine("{0} with {1} dots will be played in {2} ms", durationElement.BaseDuration, durationElement.NumberOfDots, dueTime);
                    Timer.Change((int)dueTime, Timeout.Infinite);
                }
                else
                {
                    FetchNextElement(timerState);                  //If element does not have a duration, play next immediately
                }
                if (noteOrRest != null && noteOrRest.Tuplet == TupletType.Stop)
                {
                    TupletState = null;
                }

                PlayElement(CurrentElement);
            }
            catch (Exception ex)
            {
                PlaybackExceptions.Add(ex);
                Stop();
            }
        }
Exemple #10
0
 public static float Elapsed(this IHasDuration duration)
 {
     return(duration.Duration - duration.Remaining);
 }