Explorar o código

feat(Articulation): render marcato, up and down

sschmid %!s(int64=4) %!d(string=hai) anos
pai
achega
8104dfa415

+ 10 - 0
src/MusicalScore/Graphical/VexFlow/VexFlowConverter.ts

@@ -400,6 +400,16 @@ export class VexFlowConverter {
                     vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;
                     break;
                 }
+                case ArticulationEnum.marcatodown: {
+                    vfArt = new Vex.Flow.Articulation("a|"); // Vexflow only knows marcato up, so we use a down stroke here.
+                    vfArtPosition = Vex.Flow.Modifier.Position.ABOVE; // TODO take position from xml? can be below
+                    break;
+                }
+                case ArticulationEnum.marcatoup: {
+                    vfArt = new Vex.Flow.Articulation("a^");
+                    vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;
+                    break;
+                }
                 case ArticulationEnum.invertedfermata: {
                     vfArt = new Vex.Flow.Articulation("a@u");
                     vfArtPosition = Vex.Flow.Modifier.Position.BELOW;

+ 1 - 1
src/MusicalScore/ScoreIO/InstrumentReader.ts

@@ -401,7 +401,7 @@ export class InstrumentReader {
              expressionReader.read(
                xmlNode, this.currentMeasure, previousFraction
              );
-          }
+            }
           }
           lastNoteWasGrace = isGraceNote;
         } else if (xmlNode.name === "attributes") {

+ 16 - 8
src/MusicalScore/ScoreIO/MusicSymbolModules/ArticulationReader.ts

@@ -41,20 +41,28 @@ export class ArticulationReader {
    */
   public addArticulationExpression(node: IXmlElement, currentVoiceEntry: VoiceEntry): void {
     if (node !== undefined && node.elements().length > 0) {
-      const childNotes: IXmlElement[] = node.elements();
-      for (let idx: number = 0, len: number = childNotes.length; idx < len; ++idx) {
-        const childNote: IXmlElement = childNotes[idx];
-        const name: string = childNote.name;
+      const childNodes: IXmlElement[] = node.elements();
+      for (let idx: number = 0, len: number = childNodes.length; idx < len; ++idx) {
+        const childNode: IXmlElement = childNodes[idx];
+        let name: string = childNode.name;
         try {
           // some Articulations appear in Xml separated with a "-" (eg strong-accent), we remove it for enum parsing
-          name.replace("-", "");
-          const articulationEnum: ArticulationEnum = ArticulationEnum[name];
+          name = name.replace("-", "");
+          let articulationEnum: ArticulationEnum = ArticulationEnum[name];
           if (VoiceEntry.isSupportedArticulation(articulationEnum)) {
-            // staccato should be first
+            // staccato should be first // necessary?
             if (name === "staccato") {
               if (currentVoiceEntry.Articulations.length > 0 &&
                 currentVoiceEntry.Articulations[0] !== ArticulationEnum.staccato) {
-                currentVoiceEntry.Articulations.splice(0, 0, articulationEnum);
+                currentVoiceEntry.Articulations.splice(0, 0, articulationEnum); // TODO can't this overwrite another articulation?
+              }
+            }
+            if (name === "strongaccent") { // see name.replace("-", "") above
+              const marcatoType: string = childNode?.attribute("type")?.value;
+              if (marcatoType === "up") {
+                articulationEnum = ArticulationEnum.marcatoup;
+              } else if (marcatoType === "down") {
+                articulationEnum = ArticulationEnum.marcatodown;
               }
             }
 

+ 2 - 0
src/MusicalScore/VoiceData/VoiceEntry.ts

@@ -380,6 +380,8 @@ export class VoiceEntry {
 export enum ArticulationEnum {
     accent,
     strongaccent,
+    marcatoup,
+    marcatodown,
     invertedstrongaccent,
     staccato,
     staccatissimo,