浏览代码

articulation placement undefined by default, new EngravingRule ArticulationPlacementFromXML (#887) etc

down/upbow above by default
sschmid 4 年之前
父节点
当前提交
aa4fba0c31

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

@@ -244,6 +244,7 @@ export class EngravingRules {
     public RenderTimeSignatures: boolean;
     public DynamicExpressionMaxDistance: number;
     public DynamicExpressionSpacer: number;
+    public ArticulationPlacementFromXML: boolean;
     /** Position of fingering label in relation to corresponding note (left, right supported, above, below experimental) */
     public FingeringPosition: PlacementEnum;
     public FingeringInsideStafflines: boolean;
@@ -518,6 +519,7 @@ export class EngravingRules {
         this.RenderMultipleRestMeasures = true;
         this.AutoGenerateMutipleRestMeasuresFromRestMeasures = true;
         this.RenderTimeSignatures = true;
+        this.ArticulationPlacementFromXML = true;
         this.FingeringPosition = PlacementEnum.Left; // easier to get bounding box, and safer for vertical layout
         this.FingeringInsideStafflines = false;
         this.FingeringLabelFontHeight = 1.7;

+ 15 - 6
src/MusicalScore/Graphical/VexFlow/VexFlowConverter.ts

@@ -446,7 +446,8 @@ export class VexFlowConverter {
         return vfnote;
     }
 
-    public static generateArticulations(vfnote: Vex.Flow.StemmableNote, articulations: Articulation[]): void {
+    public static generateArticulations(vfnote: Vex.Flow.StemmableNote, articulations: Articulation[],
+                                        rules: EngravingRules): void {
         if (!vfnote || vfnote.getAttribute("type") === "GhostNote") {
             return;
         }
@@ -460,11 +461,13 @@ export class VexFlowConverter {
             }
             let vfArt: Vex.Flow.Articulation = undefined;
             const articulationEnum: ArticulationEnum = articulation.articulationEnum;
-            if (articulation.placement === PlacementEnum.Above) {
-                vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;
-            } else if (articulation.placement === PlacementEnum.Below) {
-                vfArtPosition = Vex.Flow.Modifier.Position.BELOW;
-            } // else if undefined: don't change
+            if (rules.ArticulationPlacementFromXML) {
+                if (articulation.placement === PlacementEnum.Above) {
+                    vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;
+                } else if (articulation.placement === PlacementEnum.Below) {
+                    vfArtPosition = Vex.Flow.Modifier.Position.BELOW;
+                } // else if undefined: don't change
+            }
             switch (articulationEnum) {
                 case ArticulationEnum.accent: {
                     vfArt = new Vex.Flow.Articulation("a>");
@@ -472,6 +475,9 @@ export class VexFlowConverter {
                 }
                 case ArticulationEnum.downbow: {
                     vfArt = new Vex.Flow.Articulation("am");
+                    if (articulation.placement === undefined) { // downbow/upbow should be above by default
+                        vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;
+                    }
                     break;
                 }
                 case ArticulationEnum.fermata: {
@@ -514,6 +520,9 @@ export class VexFlowConverter {
                 }
                 case ArticulationEnum.upbow: {
                     vfArt = new Vex.Flow.Articulation("a|");
+                    if (articulation.placement === undefined) { // downbow/upbow should be above by default
+                        vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;
+                    }
                     break;
                 }
                 case ArticulationEnum.strongaccent: {

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

@@ -1203,7 +1203,7 @@ export class VexFlowMeasure extends GraphicalMeasure {
             const graphicalVoiceEntries: GraphicalVoiceEntry[] = graphicalStaffEntry.graphicalVoiceEntries;
             for (const gve of graphicalVoiceEntries) {
                 const vfStaveNote: StemmableNote = (gve as VexFlowVoiceEntry).vfStaveNote;
-                VexFlowConverter.generateArticulations(vfStaveNote, gve.notes[0].sourceNote.ParentVoiceEntry.Articulations);
+                VexFlowConverter.generateArticulations(vfStaveNote, gve.notes[0].sourceNote.ParentVoiceEntry.Articulations, this.rules);
             }
         }
     }

+ 4 - 1
src/MusicalScore/ScoreIO/MusicSymbolModules/ArticulationReader.ts

@@ -133,7 +133,10 @@ export class ArticulationReader {
       const articulationEnum: ArticulationEnum = xmlElementToArticulationEnum[xmlArticulation];
       const node: IXmlElement = xmlNode.element(xmlArticulation);
       if (node) {
-        let placement: PlacementEnum = PlacementEnum.Above;
+        let placement: PlacementEnum; // set undefined by default, to not restrict placement
+        if (node.attribute("placement")?.value === "above") {
+          placement = PlacementEnum.Above;
+        }
         if (node.attribute("placement")?.value === "below") {
           placement = PlacementEnum.Below;
         }

+ 1 - 1
src/MusicalScore/VoiceData/Articulation.ts

@@ -5,7 +5,7 @@ export class Articulation {
     public placement: PlacementEnum;
     public articulationEnum: ArticulationEnum;
 
-    constructor(articulationEnum: ArticulationEnum, placement: PlacementEnum = PlacementEnum.Above) {
+    constructor(articulationEnum: ArticulationEnum, placement: PlacementEnum) {
         this.articulationEnum = articulationEnum;
         this.placement = placement;
     }

+ 2 - 2
test/data/OSMD_function_test_all.xml

@@ -735,7 +735,7 @@
         <beam number="1">begin</beam>
         <notations>
           <articulations>
-            <tenuto/>
+            <tenuto placement="below"/>
             </articulations>
           </notations>
         <lyric number="1" default-x="6.58" default-y="-80.00">
@@ -755,7 +755,7 @@
         <beam number="1">end</beam>
         <notations>
           <articulations>
-            <tenuto/>
+            <tenuto placement="below"/>
             </articulations>
           </notations>
         </note>