Parcourir la source

fix(Precount): Fix precount in 5/4 only counting 4 instead of 5 beats (#109)

sschmidTU il y a 1 an
Parent
commit
ae36795601
1 fichiers modifiés avec 5 ajouts et 2 suppressions
  1. 5 2
      src/Playback/PlaybackManager.ts

+ 5 - 2
src/Playback/PlaybackManager.ts

@@ -1059,14 +1059,17 @@ export class PlaybackManager implements IPlaybackParametersListener {
             this.isPreCounting = true;
             const rhythmDuration: Fraction = new Fraction(this.startRhythmBeats * preCountMeasures, this.startRhythmDenominator);
             const sourceMeasureDuration: Fraction = this.musicPartManager.MusicSheet.SourceMeasures[this.currentMeasureIndex].Duration;
-            const measureDuration: Fraction = new Fraction(sourceMeasureDuration.Numerator * preCountMeasures, sourceMeasureDuration.Denominator);
+            const beats: number = sourceMeasureDuration.Numerator + sourceMeasureDuration.WholeValue * sourceMeasureDuration.Denominator;
+            // for 5/4 time or any time signature with RealValue > 1, Numerator / Denominator is not accurate for measure duration
+            //   because of the Fraction.simplify() method reducing 5/4 to 1/4 + wholeValue 1
+            const measureDuration: Fraction = new Fraction(beats * preCountMeasures, sourceMeasureDuration.Denominator);
             const duration: Fraction =
                 Fraction.plus(this.musicPartManager.MusicSheet.SourceMeasures[this.currentMeasureIndex].AbsoluteTimestamp,
                     measureDuration).Sub(this.currentIteratorSourceTimeStamp);
 
             preCountDuration = rhythmDuration;
 
-            if (rhythmDuration.gte(duration)) { // make sure that missing duration can't get negative (e.g. if measure is longer that given rhythm.
+            if (rhythmDuration.gte(duration)) { // make sure that missing duration can't be negative (e.g. if measure is longer than given rhythm)
                 const missingDuration: Fraction = Fraction.minus(rhythmDuration, duration);
 
                 if (missingDuration.RealValue / rhythmDuration.RealValue < 0.5) {