فهرست منبع

fix(dynamics, drawingRange): fix crescendo crashing when partially out of drawingRange (#644)

fix #644
sschmid 5 سال پیش
والد
کامیت
8105270871
2فایلهای تغییر یافته به همراه26 افزوده شده و 6 حذف شده
  1. 14 5
      src/MusicalScore/Graphical/MusicSheetCalculator.ts
  2. 12 1
      src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts

+ 14 - 5
src/MusicalScore/Graphical/MusicSheetCalculator.ts

@@ -977,13 +977,24 @@ export abstract class MusicSheetCalculator {
         }
         }
 
 
         graphicalContinuousDynamic.EndMeasure = endMeasure;
         graphicalContinuousDynamic.EndMeasure = endMeasure;
+        const staffLine: StaffLine = graphicalContinuousDynamic.ParentStaffLine;
         const endStaffLine: StaffLine = endMeasure.ParentStaffLine;
         const endStaffLine: StaffLine = endMeasure.ParentStaffLine;
+
+        // check if Expression spreads over the same StaffLine or not
+        const sameStaffLine: boolean = endStaffLine !== undefined && staffLine === endStaffLine;
+
+        let isPartOfMultiStaffInstrument: boolean = false;
+        if (endStaffLine) { // unfortunately we can't do something like (endStaffLine?.check() || staffLine?.check()) in this typescript version
+            isPartOfMultiStaffInstrument = endStaffLine.isPartOfMultiStaffInstrument();
+        } else if (staffLine) {
+            isPartOfMultiStaffInstrument = staffLine.isPartOfMultiStaffInstrument();
+        }
+
         const endAbsoluteTimestamp: Fraction = Fraction.createFromFraction(graphicalContinuousDynamic.ContinuousDynamic.EndMultiExpression.AbsoluteTimestamp);
         const endAbsoluteTimestamp: Fraction = Fraction.createFromFraction(graphicalContinuousDynamic.ContinuousDynamic.EndMultiExpression.AbsoluteTimestamp);
 
 
         const endPosInStaffLine: PointF2D = this.getRelativePositionInStaffLineFromTimestamp(
         const endPosInStaffLine: PointF2D = this.getRelativePositionInStaffLineFromTimestamp(
-            endAbsoluteTimestamp, staffIndex, endStaffLine, endStaffLine.isPartOfMultiStaffInstrument(), 0);
+            endAbsoluteTimestamp, staffIndex, endStaffLine, isPartOfMultiStaffInstrument, 0);
 
 
-        const staffLine: StaffLine = graphicalContinuousDynamic.ParentStaffLine;
         //currentMusicSystem and currentStaffLine
         //currentMusicSystem and currentStaffLine
         const musicSystem: MusicSystem = staffLine.ParentMusicSystem;
         const musicSystem: MusicSystem = staffLine.ParentMusicSystem;
         const currentStaffLineIndex: number = musicSystem.StaffLines.indexOf(staffLine);
         const currentStaffLineIndex: number = musicSystem.StaffLines.indexOf(staffLine);
@@ -996,9 +1007,6 @@ export abstract class MusicSheetCalculator {
         // if ContinuousDynamicExpression is given from wedge
         // if ContinuousDynamicExpression is given from wedge
         let secondGraphicalContinuousDynamic: GraphicalContinuousDynamicExpression = undefined;
         let secondGraphicalContinuousDynamic: GraphicalContinuousDynamicExpression = undefined;
 
 
-        // check if Expression spreads over the same StaffLine or not
-        const sameStaffLine: boolean = endStaffLine !== undefined && staffLine === endStaffLine;
-
         // last length check
         // last length check
         if (sameStaffLine && endPosInStaffLine.x - startPosInStaffline.x < this.rules.WedgeMinLength) {
         if (sameStaffLine && endPosInStaffLine.x - startPosInStaffline.x < this.rules.WedgeMinLength) {
             endPosInStaffLine.x = startPosInStaffline.x + this.rules.WedgeMinLength;
             endPosInStaffLine.x = startPosInStaffline.x + this.rules.WedgeMinLength;
@@ -1007,6 +1015,7 @@ export abstract class MusicSheetCalculator {
         // Upper staff wedge always starts at the given position and the lower staff wedge always starts at the begin of measure
         // Upper staff wedge always starts at the given position and the lower staff wedge always starts at the begin of measure
         const upperStartX: number = startPosInStaffline.x;
         const upperStartX: number = startPosInStaffline.x;
         const lowerStartX: number = endStaffLine.Measures[0].beginInstructionsWidth - this.rules.WedgeHorizontalMargin - 2;
         const lowerStartX: number = endStaffLine.Measures[0].beginInstructionsWidth - this.rules.WedgeHorizontalMargin - 2;
+        //TODO fix this when a range of measures to draw is given that doesn't include all the dynamic's measures (e.g. for crescendo)
         let upperEndX: number = 0;
         let upperEndX: number = 0;
         let lowerEndX: number = 0;
         let lowerEndX: number = 0;
 
 

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

@@ -519,7 +519,13 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
       graphicalContinuousDynamic.StartMeasure = startMeasure;
       graphicalContinuousDynamic.StartMeasure = startMeasure;
 
 
       if (!graphicalContinuousDynamic.IsVerbal && continuousDynamic.EndMultiExpression) {
       if (!graphicalContinuousDynamic.IsVerbal && continuousDynamic.EndMultiExpression) {
-        this.calculateGraphicalContinuousDynamic(graphicalContinuousDynamic, dynamicStartPosition);
+        try {
+          this.calculateGraphicalContinuousDynamic(graphicalContinuousDynamic, dynamicStartPosition);
+        } catch (e) {
+          // TODO this sometimes fails when the measure range to draw doesn't include all the dynamic's measures, method needs to be adjusted
+          //   see calculateGraphicalContinuousDynamic(), also in MusicSheetCalculator.
+
+        }
       } else if (graphicalContinuousDynamic.IsVerbal) {
       } else if (graphicalContinuousDynamic.IsVerbal) {
         this.calculateGraphicalVerbalContinuousDynamic(graphicalContinuousDynamic, dynamicStartPosition);
         this.calculateGraphicalVerbalContinuousDynamic(graphicalContinuousDynamic, dynamicStartPosition);
       } else {
       } else {
@@ -692,8 +698,13 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
     for (const graphicalMusicPage of this.graphicalMusicSheet.MusicPages) {
     for (const graphicalMusicPage of this.graphicalMusicSheet.MusicPages) {
         for (const musicSystem of graphicalMusicPage.MusicSystems) {
         for (const musicSystem of graphicalMusicPage.MusicSystems) {
             for (const staffLine of musicSystem.StaffLines) {
             for (const staffLine of musicSystem.StaffLines) {
+              try {
                 (<VexFlowStaffLine>staffLine).AlignmentManager.alignDynamicExpressions();
                 (<VexFlowStaffLine>staffLine).AlignmentManager.alignDynamicExpressions();
                 staffLine.AbstractExpressions.forEach(ae => ae.updateSkyBottomLine());
                 staffLine.AbstractExpressions.forEach(ae => ae.updateSkyBottomLine());
+              } catch (e) {
+                // TODO still necessary when calculation of expression fails, see calculateDynamicExpressionsForMultiExpression()
+                //   see calculateGraphicalContinuousDynamic(), also in MusicSheetCalculator.
+              }
             }
             }
         }
         }
     }
     }