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()); }
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); }
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()); }
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(); } }
public static float Elapsed(this IHasDuration duration) { return(duration.Duration - duration.Remaining); }