Sfoglia il codice sorgente

fix(OctaveShift): avoid some errors when end of octaveshift not found (#778)

also relevant for #777, #591
sschmid 5 anni fa
parent
commit
86e6726f4b

+ 1 - 1
src/Common/DataObjects/Fraction.ts

@@ -239,7 +239,7 @@ export class Fraction {
   }
 
   public Equals(obj: Fraction): boolean {
-    return this.realValue === obj.realValue;
+    return this.realValue === obj?.realValue;
   }
 
   public CompareTo(obj: Fraction): number {

+ 1 - 1
src/MusicalScore/Graphical/GraphicalMeasure.ts

@@ -190,7 +190,7 @@ export abstract class GraphicalMeasure extends GraphicalObject {
     public findGraphicalStaffEntryFromTimestamp(relativeTimestamp: Fraction): GraphicalStaffEntry {
         for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {
             const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];
-            if (graphicalStaffEntry.relInMeasureTimestamp.Equals(relativeTimestamp)) {
+            if (graphicalStaffEntry.relInMeasureTimestamp?.Equals(relativeTimestamp)) {
                 return graphicalStaffEntry;
             }
         }

+ 1 - 1
src/MusicalScore/Graphical/GraphicalMusicSheet.ts

@@ -462,7 +462,7 @@ export class GraphicalMusicSheet {
     public getLastGraphicalMeasureFromIndex(staffIndex: number, lastRendered: boolean = true): GraphicalMeasure {
         let measureIndex: number = this.measureList.length - 1;
         if (lastRendered) {
-            measureIndex = this.musicSheet.Rules.MaxMeasureToDrawIndex;
+            measureIndex = Math.min(measureIndex, this.musicSheet.Rules.MaxMeasureToDrawIndex);
         }
         return this.measureList[measureIndex][staffIndex];
     }

+ 10 - 3
src/MusicalScore/Graphical/MusicSheetCalculator.ts

@@ -2032,10 +2032,17 @@ export abstract class MusicSheetCalculator {
             const multiExpression: MultiExpression = sourceMeasure.StaffLinkedExpressions[staffIndex][idx];
             if (multiExpression.OctaveShiftStart) {
                 const openOctaveShift: OctaveShift = multiExpression.OctaveShiftStart;
-                openOctaveShifts[staffIndex] = new OctaveShiftParams(
-                    openOctaveShift, multiExpression.AbsoluteTimestamp,
-                    openOctaveShift.ParentEndMultiExpression.AbsoluteTimestamp
+                let absoluteEnd: Fraction = openOctaveShift?.ParentEndMultiExpression?.AbsoluteTimestamp;
+                if (!openOctaveShift?.ParentEndMultiExpression) {
+                    const measureEndTimestamp: Fraction = Fraction.plus(sourceMeasure.AbsoluteTimestamp, sourceMeasure.Duration);
+                    absoluteEnd = measureEndTimestamp;
+                    // TODO better handling if end expression missing
+                    // old comment:
                     // TODO check if octaveshift end exists, otherwise set to last measure end. only necessary if xml was cut manually and is incomplete
+                }
+                openOctaveShifts[staffIndex] = new OctaveShiftParams(
+                    openOctaveShift, multiExpression?.AbsoluteTimestamp,
+                    absoluteEnd
                 );
             }
         }

+ 1 - 1
src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts

@@ -577,7 +577,7 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
     const octaveShift: OctaveShift = multiExpression.OctaveShiftStart;
 
     const startTimeStamp: Fraction = octaveShift.ParentStartMultiExpression.Timestamp;
-    const endTimeStamp: Fraction = octaveShift.ParentEndMultiExpression.Timestamp;
+    const endTimeStamp: Fraction = octaveShift.ParentEndMultiExpression?.Timestamp;
 
     const minMeasureToDrawIndex: number = this.rules.MinMeasureToDrawIndex;
     const maxMeasureToDrawIndex: number = this.rules.MaxMeasureToDrawIndex;