Browse Source

feat(Rehearsal Marks): add osmd.rules.RehearsalMarkXOffsetSystemStartMeasure (#919) (default -20[px])

sschmid 4 years ago
parent
commit
84d60e1499

+ 2 - 0
src/MusicalScore/Graphical/EngravingRules.ts

@@ -112,6 +112,7 @@ export class EngravingRules {
     public RepetitionSymbolsYOffset: number;
     public RehearsalMarkXOffset: number;
     public RehearsalMarkXOffsetDefault: number;
+    public RehearsalMarkXOffsetSystemStartMeasure: number;
     public RehearsalMarkYOffset: number;
     public RehearsalMarkYOffsetDefault: number;
     public RehearsalMarkFontSize: number;
@@ -423,6 +424,7 @@ export class EngravingRules {
         this.RepetitionSymbolsYOffset = 0;
         this.RehearsalMarkXOffsetDefault = 10; // avoid collision with metronome number
         this.RehearsalMarkXOffset = 0; // user defined
+        this.RehearsalMarkXOffsetSystemStartMeasure = -20; // good test: Haydn Concertante
         this.RehearsalMarkYOffsetDefault = -15;
         this.RehearsalMarkYOffset = 0; // user defined
         this.RehearsalMarkFontSize = 10; // vexflow default: 12, too big with chord symbols

+ 1 - 0
src/MusicalScore/Graphical/MusicSystemBuilder.ts

@@ -84,6 +84,7 @@ export class MusicSystemBuilder {
             const sourceMeasureEndsPart: boolean = sourceMeasure.HasEndLine;
             const sourceMeasureBreaksSystem: boolean = sourceMeasureEndsPart && this.rules.NewPartAndSystemAfterFinalBarline;
             const isSystemStartMeasure: boolean = this.currentSystemParams.IsSystemStartMeasure();
+            sourceMeasure.IsSystemStartMeasure = isSystemStartMeasure;
             const isFirstSourceMeasure: boolean = sourceMeasure === this.graphicalMusicSheet.ParentMusicSheet.getFirstSourceMeasure();
             let currentMeasureBeginInstructionsWidth: number = this.rules.MeasureLeftMargin;
             let currentMeasureEndInstructionsWidth: number = 0;

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

@@ -773,7 +773,10 @@ export class VexFlowMusicSheetCalculator extends MusicSheetCalculator {
     const staffNumber: number = 0;
     const vfStave: Vex.Flow.Stave = (this.graphicalMusicSheet.MeasureList[measureNumber][staffNumber] as VexFlowMeasure).getVFStave();
     const yOffset: number = -this.rules.RehearsalMarkYOffsetDefault - this.rules.RehearsalMarkYOffset;
-    const xOffset: number = this.rules.RehearsalMarkXOffsetDefault + this.rules.RehearsalMarkXOffset;
+    let xOffset: number = this.rules.RehearsalMarkXOffsetDefault + this.rules.RehearsalMarkXOffset;
+    if (measure.IsSystemStartMeasure) {
+      xOffset += this.rules.RehearsalMarkXOffsetSystemStartMeasure;
+    }
     // const section: Vex.Flow.StaveSection = new Vex.Flow.StaveSection(rehearsalExpression.label, vfStave.getX(), yOffset);
     // (vfStave as any).modifiers.push(section);
     const fontSize: number = this.rules.RehearsalMarkFontSize;

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

@@ -58,6 +58,7 @@ export class SourceMeasure {
     public printNewSystemXml: boolean = false;
     /** Whether the MusicXML says to print a new page (page break). See OSMDOptions.newPageFromXML */
     public printNewPageXml: boolean = false;
+    public IsSystemStartMeasure: boolean = false;
 
     private measureNumber: number;
     public MeasureNumberXML: number;