Bläddra i källkod

feat(rhythm): save ActiveTimeSignature in SourceMeasure

the SourceMeasureDuration is often simplified to 1/1, which hides a time signature like 4/4.
Simon Schmid 5 år sedan
förälder
incheckning
4927727490

+ 13 - 0
src/Common/DataObjects/Fraction.ts

@@ -302,6 +302,19 @@ export class Fraction {
     }
   }
 
+  private static FloatInaccuracyTolerance: number = 0.0001; // inaccuracy allowed when comparing Fraction.RealValues, because of floating point inaccuracy
+
+  public isOnBeat(timeSignature: Fraction): boolean { // use sourceMeasure.ActiveTimeSignature as timeSignature
+      const beatDistance: number = this.distanceFromBeat(timeSignature);
+      return Math.abs(beatDistance) < Fraction.FloatInaccuracyTolerance;
+  }
+
+  public distanceFromBeat(timeSignature: Fraction): number {
+      const beatStep: Fraction = new Fraction(1, timeSignature.Denominator);
+      const distanceFromBeat: number = this.RealValue % beatStep.RealValue; // take modulo the beat value, e.g. 1/8 in a 3/8 time signature
+      return distanceFromBeat;
+  }
+
 
   //private static equals(f1: Fraction, f2: Fraction): boolean {
   //    return f1.numerator * f2.denominator === f2.numerator * f1.denominator;

+ 2 - 1
src/MusicalScore/ScoreIO/MusicSheetReader.ts

@@ -366,7 +366,8 @@ export class MusicSheetReader /*implements IMusicSheetReader*/ {
         if (!this.currentMeasure.ImplicitMeasure) {
             sourceMeasureCounter++;
         }
-        this.currentMeasure.Duration = maxInstrumentDuration;
+        this.currentMeasure.Duration = maxInstrumentDuration; // can be 1/1 in a 4/4 time signature
+        this.currentMeasure.ActiveTimeSignature = activeRhythm;
         this.currentMeasure.MeasureNumber = sourceMeasureCounter;
         for (let i: number = 0; i < instrumentsDurations.length; i++) {
             const instrumentsDuration: Fraction = instrumentsDurations[i];

+ 10 - 1
src/MusicalScore/VoiceData/SourceMeasure.ts

@@ -56,6 +56,7 @@ export class SourceMeasure {
     private absoluteTimestamp: Fraction;
     private completeNumberOfStaves: number;
     private duration: Fraction;
+    private activeTimeSignature: Fraction;
     private staffLinkedExpressions: MultiExpression[][] = [];
     private tempoExpressions: MultiTempoExpression[] = [];
     private verticalSourceStaffEntryContainers: VerticalSourceStaffEntryContainer[] = [];
@@ -90,13 +91,21 @@ export class SourceMeasure {
     }
 
     public get Duration(): Fraction {
-        return this.duration;
+        return this.duration; // can be 1/1 in a 4/4 measure
     }
 
     public set Duration(value: Fraction) {
         this.duration = value;
     }
 
+    public get ActiveTimeSignature(): Fraction {
+        return this.activeTimeSignature;
+    }
+
+    public set ActiveTimeSignature(value: Fraction) {
+        this.activeTimeSignature = value;
+    }
+
     public get ImplicitMeasure(): boolean {
         return this.implicitMeasure;
     }