Explorar el Código

ornaments: read placement from XML (below not yet supported in) (#866)

sschmid hace 5 años
padre
commit
a778eb554d

+ 3 - 2
src/MusicalScore/Graphical/VexFlow/VexFlowConverter.ts

@@ -27,6 +27,7 @@ import { Note } from "../../../MusicalScore/VoiceData/Note";
 import StaveNote = Vex.Flow.StaveNote;
 import { ArpeggioType } from "../../VoiceData/Arpeggio";
 import { TabNote } from "../../VoiceData/TabNote";
+import { PlacementEnum } from "../../VoiceData/Expressions/AbstractExpression";
 
 /**
  * Helper class, which contains static methods which actually convert
@@ -477,7 +478,7 @@ export class VexFlowConverter {
 
     public static generateOrnaments(vfnote: Vex.Flow.StemmableNote, oContainer: OrnamentContainer): void {
         let vfPosition: number = Vex.Flow.Modifier.Position.ABOVE;
-        if (vfnote.getStemDirection() === Vex.Flow.Stem.UP) {
+        if (oContainer.placement === PlacementEnum.Below) {
             vfPosition = Vex.Flow.Modifier.Position.BELOW;
         }
 
@@ -530,7 +531,7 @@ export class VexFlowConverter {
             if (oContainer.AccidentalAbove !== AccidentalEnum.NONE) {
                 vfOrna.setUpperAccidental(Pitch.accidentalVexflow(oContainer.AccidentalAbove));
             }
-            vfOrna.setPosition(vfPosition);
+            vfOrna.setPosition(vfPosition); // Vexflow draws it above right now in any case, never below
             (vfnote as StaveNote).addModifier(0, vfOrna);
         }
     }

+ 7 - 0
src/MusicalScore/ScoreIO/MusicSymbolModules/ArticulationReader.ts

@@ -188,6 +188,13 @@ export class ArticulationReader {
         const node: IXmlElement = ornamentsNode.element(ornamentElement);
         if (node) {
           ornament = new OrnamentContainer(elementToOrnamentEnum[ornamentElement]);
+          const placementAttr: Attr = node.attribute("placement");
+          if (placementAttr) {
+            const placementString: string = placementAttr.value;
+            if (placementString === "below") {
+              ornament.placement = PlacementEnum.Below;
+            }
+          }
         }
       }
       if (ornament) {

+ 3 - 1
src/MusicalScore/VoiceData/OrnamentContainer.ts

@@ -1,4 +1,5 @@
-import {AccidentalEnum} from "../../Common/DataObjects/Pitch";
+import { AccidentalEnum } from "../../Common/DataObjects/Pitch";
+import { PlacementEnum } from "./Expressions/AbstractExpression";
 
 export class OrnamentContainer {
 
@@ -7,6 +8,7 @@ export class OrnamentContainer {
     }
 
     private ornament: OrnamentEnum;
+    public placement: PlacementEnum = PlacementEnum.Above;
     private accidentalAbove: AccidentalEnum = AccidentalEnum.NONE;
     private accidentalBelow: AccidentalEnum = AccidentalEnum.NONE;