Quellcode durchsuchen

merge osmd-public: fix DefaultColorMusic (also for pedals), add DefaultColorLyrics, etc

sschmidTU vor 2 Jahren
Ursprung
Commit
fcaade8326

+ 2 - 1
demo/index.js

@@ -544,7 +544,8 @@ import { TransposeCalculator } from '../src/Plugins/Transpose/TransposeCalculato
             if (createNewOsmd) {
                 // clears the canvas element
                 canvas.innerHTML = "";
-                openSheetMusicDisplay = new OpenSheetMusicDisplay(canvas, { backend: value });
+                //openSheetMusicDisplay = new OpenSheetMusicDisplay(canvas, { backend: value }); // resets EngravingRules
+                openSheetMusicDisplay.setOptions({backend: value});
                 openSheetMusicDisplay.setLogLevel('info'); // set this to 'debug' if you want to get more detailed control flow information
             } else {
                 // alternative, doesn't work yet, see setOptions():

+ 3 - 2
src/MusicalScore/Graphical/DrawingParameters.ts

@@ -21,7 +21,7 @@ export enum DrawingParametersEnum {
 export class DrawingParameters {
     /** will set other settings if changed with set method */
     private drawingParametersEnum: DrawingParametersEnum;
-    private rules: EngravingRules = new EngravingRules();
+    private rules: EngravingRules;
     public drawHighlights: boolean;
     public drawErrors: boolean;
     public drawSelectionStartSymbol: boolean;
@@ -43,7 +43,8 @@ export class DrawingParameters {
     /** Draw notes set to be invisible (print-object="no" in XML). */
     public drawHiddenNotes: boolean = false;
 
-    constructor(drawingParameters: DrawingParametersEnum = DrawingParametersEnum.default) {
+    constructor(drawingParameters: DrawingParametersEnum = DrawingParametersEnum.default, rules?: EngravingRules) {
+        this.rules = rules;
         this.DrawingParametersEnum = drawingParameters;
     }
 

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

@@ -287,6 +287,7 @@ export class EngravingRules {
     public DefaultColorRest: string;
     public DefaultColorStem: string;
     public DefaultColorLabel: string;
+    public DefaultColorLyrics: string;
     public DefaultColorChordSymbol: string;
     public DefaultColorTitle: string;
     public DefaultColorCursor: string;
@@ -782,6 +783,7 @@ export class EngravingRules {
         this.DefaultColorRest = color;
         this.DefaultColorStem = color;
         this.DefaultColorLabel = color;
+        this.DefaultColorLyrics = color;
         this.DefaultColorTitle = color;
         this.LedgerLineColorDefault = color;
     }

+ 8 - 0
src/MusicalScore/Graphical/GraphicalContinuousDynamicExpression.ts

@@ -350,6 +350,10 @@ export class GraphicalContinuousDynamicExpression extends AbstractGraphicalExpre
     private addWedgeLines(wedgePoint: PointF2D, upperWedgeEnd: PointF2D, lowerWedgeEnd: PointF2D, wedgeLineWidth: number): void {
         const upperLine: GraphicalLine = new GraphicalLine(wedgePoint, upperWedgeEnd, wedgeLineWidth);
         const lowerLine: GraphicalLine = new GraphicalLine(wedgePoint, lowerWedgeEnd, wedgeLineWidth);
+        if (this.rules.DefaultColorMusic) {
+            upperLine.colorHex = this.rules.DefaultColorMusic;
+            lowerLine.colorHex = this.rules.DefaultColorMusic;
+        }
 
         this.lines.push(upperLine);
         this.lines.push(lowerLine);
@@ -366,6 +370,10 @@ export class GraphicalContinuousDynamicExpression extends AbstractGraphicalExpre
     private addDoubleLines(upperLineStart: PointF2D, upperLineEnd: PointF2D, lowerLineStart: PointF2D, lowerLineEnd: PointF2D, wedgeLineWidth: number): void {
         const upperLine: GraphicalLine = new GraphicalLine(upperLineStart, upperLineEnd, wedgeLineWidth);
         const lowerLine: GraphicalLine = new GraphicalLine(lowerLineStart, lowerLineEnd, wedgeLineWidth);
+        if (this.rules.DefaultColorMusic) {
+            upperLine.colorHex = this.rules.DefaultColorMusic;
+            lowerLine.colorHex = this.rules.DefaultColorMusic;
+        }
 
         this.lines.push(upperLine);
         this.lines.push(lowerLine);

+ 4 - 1
src/MusicalScore/Graphical/GraphicalLyricEntry.ts

@@ -5,6 +5,7 @@ import {GraphicalStaffEntry} from "./GraphicalStaffEntry";
 import {Label} from "../Label";
 import {PointF2D} from "../../Common/DataObjects/PointF2D";
 import {TextAlignmentEnum} from "../../Common/Enums/TextAlignment";
+import { EngravingRules } from "./EngravingRules";
 
 /**
  * The graphical counterpart of a [[LyricsEntry]]
@@ -27,13 +28,15 @@ export class GraphicalLyricEntry {
             // lyricsTextAlignment = TextAlignmentAndPlacement.CenterBottom;
         }
         const label: Label = new Label(lyricsEntry.Text);
+        const rules: EngravingRules = this.graphicalStaffEntry.parentMeasure.parentSourceMeasure.Rules;
         this.graphicalLabel = new GraphicalLabel(
             label,
             lyricsHeight,
             lyricsTextAlignment,
-            this.graphicalStaffEntry.parentMeasure.parentSourceMeasure.Rules,
+            rules,
             graphicalStaffEntry.PositionAndShape,
         );
+        this.graphicalLabel.Label.colorDefault = rules.DefaultColorLyrics; // if undefined, no change. saves an if check
         this.graphicalLabel.PositionAndShape.RelativePosition = new PointF2D(0, staffHeight);
         if (lyricsTextAlignment === TextAlignmentEnum.LeftBottom) {
             this.graphicalLabel.PositionAndShape.RelativePosition.x -= 1; // make lyrics optically left-aligned

+ 7 - 3
src/MusicalScore/Graphical/GraphicalVoiceEntry.ts

@@ -10,14 +10,18 @@ import { EngravingRules } from "./EngravingRules";
  * The graphical counterpart of a [[VoiceEntry]].
  */
 export class GraphicalVoiceEntry extends GraphicalObject {
-    constructor(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry) {
+    constructor(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry, rules?: EngravingRules) {
         super();
         this.parentVoiceEntry = parentVoiceEntry;
         this.parentStaffEntry = parentStaffEntry;
         this.PositionAndShape = new BoundingBox(this, parentStaffEntry ? parentStaffEntry.PositionAndShape : undefined, true);
         this.notes = [];
-        this.rules = parentStaffEntry ?
-                        parentStaffEntry.parentMeasure.parentSourceMeasure.Rules : new EngravingRules();
+        if (rules) {
+            this.rules = rules;
+        } else {
+            this.rules = parentStaffEntry ?
+                parentStaffEntry.parentMeasure.parentSourceMeasure.Rules : new EngravingRules();
+        }
     }
 
     public parentVoiceEntry: VoiceEntry;

+ 3 - 0
src/MusicalScore/Graphical/MusicSheetCalculator.ts

@@ -3055,6 +3055,7 @@ export abstract class MusicSheetCalculator {
      */
     private calculateSingleDashForLyricWord(staffLine: StaffLine, startX: number, endX: number, y: number): void {
         const label: Label = new Label("-");
+        label.colorDefault = this.rules.DefaultColorLyrics; // if undefined, no change. saves an if check
         const dash: GraphicalLabel = new GraphicalLabel(
             label, this.rules.LyricsHeight, TextAlignmentEnum.CenterBottom, this.rules);
         dash.setLabelPositionAndShapeBorders();
@@ -3159,6 +3160,7 @@ export abstract class MusicSheetCalculator {
         const lineStart: PointF2D = new PointF2D(startX, y);
         const lineEnd: PointF2D = new PointF2D(endX, y);
         const graphicalLine: GraphicalLine = new GraphicalLine(lineStart, lineEnd, this.rules.LyricUnderscoreLineWidth);
+        graphicalLine.colorHex = this.rules.DefaultColorLyrics; // if undefined, no change. saves an if check
         staffLine.LyricLines.push(graphicalLine);
         if (this.staffLinesWithLyricWords.indexOf(staffLine) === -1) {
             this.staffLinesWithLyricWords.push(staffLine);
@@ -3175,6 +3177,7 @@ export abstract class MusicSheetCalculator {
      */
     private calculateRightAndLeftDashesForLyricWord(staffLine: StaffLine, startX: number, endX: number, y: number): number {
         const leftLabel: Label = new Label("-");
+        leftLabel.colorDefault = this.rules.DefaultColorLyrics; // if undefined, no change. saves an if check
         const leftDash: GraphicalLabel = new GraphicalLabel(
             leftLabel, this.rules.LyricsHeight, TextAlignmentEnum.CenterBottom, this.rules);
         leftDash.setLabelPositionAndShapeBorders();

+ 1 - 1
src/MusicalScore/Graphical/MusicSheetDrawer.ts

@@ -416,7 +416,7 @@ export abstract class MusicSheetDrawer {
             lyricLine.End.y += staffLine.PositionAndShape.AbsolutePosition.y;
             lyricLine.Start.x += staffLine.PositionAndShape.AbsolutePosition.x;
             lyricLine.End.x += staffLine.PositionAndShape.AbsolutePosition.x;
-            this.drawGraphicalLine(lyricLine, this.rules.LyricUnderscoreLineWidth);
+            this.drawGraphicalLine(lyricLine, this.rules.LyricUnderscoreLineWidth, lyricLine.colorHex);
         });
     }
 

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

@@ -812,7 +812,7 @@ export class VexFlowMeasure extends GraphicalMeasure {
         const vfghosts: VF.GhostNote[] = VexFlowConverter.GhostNotes(duration);
         const ghostGves: VexFlowVoiceEntry[] = [];
         for (const vfghost of vfghosts) {
-            const ghostGve: VexFlowVoiceEntry = new VexFlowVoiceEntry(undefined, undefined);
+            const ghostGve: VexFlowVoiceEntry = new VexFlowVoiceEntry(undefined, undefined, this.rules);
             ghostGve.vfStaveNote = vfghost;
             ghostGves.push(ghostGve);
         }

+ 8 - 2
src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetDrawer.ts

@@ -213,7 +213,7 @@ export class VexFlowMusicSheetDrawer extends MusicSheetDrawer {
     /** Draws a line in the current backend. Only usable while pages are drawn sequentially, because backend reference is updated in that process.
      *  To add your own lines after rendering, use DrawOverlayLine.
      */
-    protected drawLine(start: PointF2D, stop: PointF2D, color: string = "#FF0000FF", lineWidth: number = 0.2): Node {
+    protected drawLine(start: PointF2D, stop: PointF2D, color: string = "#000000FF", lineWidth: number = 0.2): Node {
         // TODO maybe the backend should be given as an argument here as well, otherwise this can't be used after rendering of multiple pages is done.
         start = this.applyScreenTransformation(start);
         stop = this.applyScreenTransformation(stop);
@@ -347,6 +347,7 @@ export class VexFlowMusicSheetDrawer extends MusicSheetDrawer {
     private drawLyrics(lyricEntries: GraphicalLyricEntry[], layer: number): void {
         lyricEntries.forEach(lyricsEntry => {
             const label: GraphicalLabel = lyricsEntry.GraphicalLabel;
+            label.Label.colorDefault = this.rules.DefaultColorLyrics;
             label.SVGNode = this.drawLabel(label, layer);
         });
     }
@@ -369,6 +370,9 @@ export class VexFlowMusicSheetDrawer extends MusicSheetDrawer {
                 const vexFlowOctaveShift: VexFlowOctaveShift = graphicalOctaveShift as VexFlowOctaveShift;
                 const ctx: Vex.IRenderContext = this.backend.getContext();
                 const textBracket: VF.TextBracket = vexFlowOctaveShift.getTextBracket();
+                if (this.rules.DefaultColorMusic) {
+                    (textBracket as any).render_options.color = this.rules.DefaultColorMusic;
+                }
                 textBracket.setContext(ctx);
                 try {
                     textBracket.draw();
@@ -385,6 +389,7 @@ export class VexFlowMusicSheetDrawer extends MusicSheetDrawer {
                 const vexFlowPedal: VexFlowPedal = graphicalPedal as VexFlowPedal;
                 const ctx: Vex.IRenderContext = this.backend.getContext();
                 const pedalMarking: Vex.Flow.PedalMarking = vexFlowPedal.getPedalMarking();
+                (pedalMarking as any).render_options.color = this.rules.DefaultColorMusic;
                 pedalMarking.setContext(ctx);
                 pedalMarking.draw();
             }
@@ -448,7 +453,8 @@ export class VexFlowMusicSheetDrawer extends MusicSheetDrawer {
                                                      graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.y + line.Start.y);
                 const end: PointF2D = new PointF2D(graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.x + line.End.x,
                                                    graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.y + line.End.y);
-                this.drawLine(start, end, "black", line.Width);
+                this.drawLine(start, end, line.colorHex ?? "#000000", line.Width);
+                // the null check for colorHex is not strictly necessary anymore, but the previous default color was red.
             }
         }
     }

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

@@ -8,12 +8,13 @@ import { NoteEnum } from "../../../Common/DataObjects/Pitch";
 import { Note } from "../../VoiceData/Note";
 import { ColoringModes } from "./../DrawingParameters";
 import { GraphicalNote } from "../GraphicalNote";
+import { EngravingRules } from "../EngravingRules";
 
 export class VexFlowVoiceEntry extends GraphicalVoiceEntry {
     private mVexFlowStaveNote: VF.StemmableNote;
 
-    constructor(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry) {
-        super(parentVoiceEntry, parentStaffEntry);
+    constructor(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry, rules?: EngravingRules) {
+        super(parentVoiceEntry, parentStaffEntry, rules);
     }
 
     public applyBordersFromVexflow(): void {

+ 17 - 11
src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

@@ -412,8 +412,10 @@ export class OpenSheetMusicDisplay {
                 // TODO optional: reduce zoom to fit the score within the limit.
             }
 
-            backend.resize(width, height);
+            backend.resize(width, height); // this resets strokeStyle for Canvas
             backend.clear(); // set bgcolor if defined (this.rules.PageBackgroundColor, see OSMDOptions)
+            backend.getContext().setFillStyle(this.rules.DefaultColorMusic);
+            backend.getContext().setStrokeStyle(this.rules.DefaultColorMusic); // needs to be set after resize()
             this.drawer.Backends.push(backend);
             this.graphic.drawer = this.drawer;
         }
@@ -458,9 +460,17 @@ export class OpenSheetMusicDisplay {
         if (!this.rules) {
             this.rules = new EngravingRules();
         }
-        if (!this.drawingParameters) {
-            this.drawingParameters = new DrawingParameters();
-            this.drawingParameters.Rules = this.rules;
+        if (!this.drawingParameters && !options.drawingParameters) {
+            this.drawingParameters = new DrawingParameters(DrawingParametersEnum.default, this.rules);
+            // if "default", will be created below
+        } else if (options.drawingParameters) {
+            if (!this.drawingParameters) {
+                this.drawingParameters = new DrawingParameters(DrawingParametersEnum[options.drawingParameters], this.rules);
+            } else {
+                this.drawingParameters.DrawingParametersEnum =
+                    (<any>DrawingParametersEnum)[options.drawingParameters.toLowerCase()];
+                    // see DrawingParameters.ts: set DrawingParametersEnum, and DrawingParameters.ts:setForCompactTightMode()
+            }
         }
         if (options === undefined || options === null) {
             log.warn("warning: osmd.setOptions() called without an options parameter, has no effect."
@@ -471,11 +481,6 @@ export class OpenSheetMusicDisplay {
         if (options.onXMLRead) {
             this.OnXMLRead = options.onXMLRead;
         }
-        if (options.drawingParameters) {
-            this.drawingParameters.DrawingParametersEnum =
-                (<any>DrawingParametersEnum)[options.drawingParameters.toLowerCase()];
-                // see DrawingParameters.ts: set DrawingParametersEnum, and DrawingParameters.ts:setForCompactTightMode()
-        }
 
         const backendNotInitialized: boolean = !this.drawer || !this.drawer.Backends || this.drawer.Backends.length < 1;
         let needBackendUpdate: boolean = backendNotInitialized;
@@ -948,8 +953,9 @@ export class OpenSheetMusicDisplay {
         }
         backend.graphicalMusicPage = page; // the page the backend renders on. needed to identify DOM element to extract image/SVG
         backend.initialize(this.container, this.zoom);
-        backend.getContext().setFillStyle(this.rules.DefaultColorMusic);
-        backend.getContext().setStrokeStyle(this.rules.DefaultColorMusic);
+        //backend.getContext().setFillStyle(this.rules.DefaultColorMusic);
+        //backend.getContext().setStrokeStyle(this.rules.DefaultColorMusic);
+        // color needs to be set after resize() for CanvasBackend
         return backend;
     }
 

+ 2 - 0
src/VexFlowPatch/readme.txt

@@ -56,6 +56,7 @@ fix y-shift
 stavesection.js (half-fixed vexflow 4.x, collision, box not removable):
 stavesection.draw():
 adjust rectangle positioning, make height depend on text height
+fix rehearsal marks not rendered with canvas backend in browser
 
 stavetie.js (merged vexflow 4.x):
 context opens group for stavetie, can get stavetie SVG element via getAttribute("el")
@@ -72,6 +73,7 @@ Add manual flag rendering variable so we can choose not to render flags if notes
 
 svgcontext.js (custom addition, probably not necessary for vexflow 4):
 able to add extra attributes (like svg node id) to a stroke (e.g. stem)
+fix rect() always using black color, ignoring attributes.stroke (ctx strokeStlye) -> fix defaultColorMusic ignored
 
 tabnote.js (merged Vexflow 3.x):
 Add a context group for each tabnote, so that it can be found in the SVG DOM ("vf-tabnote")

+ 4 - 1
src/VexFlowPatch/src/stavesection.js

@@ -36,9 +36,12 @@ export class StaveSection extends StaveModifier {
     const text_measurements = ctx.measureText('' + this.section);
     const text_width = text_measurements.width;
     let text_height = text_measurements.height;
-    if (!text_height) {
+    if (!text_height && text_measurements.emHeightAscent >= 0) { // VexFlowPatch
       text_height = text_measurements.emHeightAscent + 2; // node canvas / generateImages fix
     }
+    if (!text_height) { // canvas: sometimes no height available (VexFlowPatch)
+      text_height = text_measurements.fontBoundingBoxAscent + 3; // estimation
+    }
     let width = text_width + 6;  // add left & right padding
     if (width < 18) width = 18;
     const height = text_height + this.font.size / 10; // font.size / 10: padding

+ 1 - 1
src/VexFlowPatch/src/svgcontext.js

@@ -346,7 +346,7 @@ export class SVGContext {
       attributes = {
         fill: 'none',
         'stroke-width': this.lineWidth,
-        stroke: 'black',
+        stroke: this.attributes.stroke, // VexFlowPatch: fix hardcoded 'black' instead of attributes.stroke (ctx strokeStyle)
       };
     }
 

+ 162 - 0
test/data/test_pedal_color.musicxml

@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.1 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise version="3.1">
+  <work>
+    <work-title>Title</work-title>
+    </work>
+  <identification>
+    <creator type="composer">Composer</creator>
+    <encoding>
+      <software>MuseScore 3.6.2</software>
+      <encoding-date>2022-09-19</encoding-date>
+      <supports element="accidental" type="yes"/>
+      <supports element="beam" type="yes"/>
+      <supports element="print" attribute="new-page" type="yes" value="yes"/>
+      <supports element="print" attribute="new-system" type="yes" value="yes"/>
+      <supports element="stem" type="yes"/>
+      </encoding>
+    </identification>
+  <defaults>
+    <scaling>
+      <millimeters>6.99911</millimeters>
+      <tenths>40</tenths>
+      </scaling>
+    <page-layout>
+      <page-height>1596.77</page-height>
+      <page-width>1233.87</page-width>
+      <page-margins type="even">
+        <left-margin>85.7252</left-margin>
+        <right-margin>85.7252</right-margin>
+        <top-margin>85.7252</top-margin>
+        <bottom-margin>85.7252</bottom-margin>
+        </page-margins>
+      <page-margins type="odd">
+        <left-margin>85.7252</left-margin>
+        <right-margin>85.7252</right-margin>
+        <top-margin>85.7252</top-margin>
+        <bottom-margin>85.7252</bottom-margin>
+        </page-margins>
+      </page-layout>
+    <word-font font-family="Edwin" font-size="10"/>
+    <lyric-font font-family="Edwin" font-size="10"/>
+    </defaults>
+  <credit page="1">
+    <credit-type>title</credit-type>
+    <credit-words default-x="616.935" default-y="1511.05" justify="center" valign="top" font-size="22">Title</credit-words>
+    </credit>
+  <credit page="1">
+    <credit-type>composer</credit-type>
+    <credit-words default-x="1148.15" default-y="1411.05" justify="right" valign="bottom">Composer</credit-words>
+    </credit>
+  <part-list>
+    <score-part id="P1">
+      <part-name>Piano</part-name>
+      <part-abbreviation>Pno.</part-abbreviation>
+      <score-instrument id="P1-I1">
+        <instrument-name>Piano</instrument-name>
+        </score-instrument>
+      <midi-device id="P1-I1" port="1"></midi-device>
+      <midi-instrument id="P1-I1">
+        <midi-channel>1</midi-channel>
+        <midi-program>1</midi-program>
+        <volume>78.7402</volume>
+        <pan>0</pan>
+        </midi-instrument>
+      </score-part>
+    </part-list>
+  <part id="P1">
+    <measure number="1" width="462.73">
+      <print>
+        <system-layout>
+          <system-margins>
+            <left-margin>50.00</left-margin>
+            <right-margin>515.97</right-margin>
+            </system-margins>
+          <top-system-distance>170.00</top-system-distance>
+          </system-layout>
+        </print>
+      <attributes>
+        <divisions>1</divisions>
+        <key>
+          <fifths>0</fifths>
+          </key>
+        <time>
+          <beats>4</beats>
+          <beat-type>4</beat-type>
+          </time>
+        <clef>
+          <sign>G</sign>
+          <line>2</line>
+          </clef>
+        </attributes>
+	  <direction placement="below">
+        <direction-type>
+          <pedal default-y="-96" line="no" relative-x="-9" type="start"/>
+        </direction-type>
+        <staff>2</staff>
+        <sound damper-pedal="yes"/>
+      </direction>
+      <note default-x="80.72" default-y="-30.00">
+        <pitch>
+          <step>G</step>
+          <octave>4</octave>
+          </pitch>
+        <duration>1</duration>
+        <voice>1</voice>
+        <type>quarter</type>
+        <stem>up</stem>
+        </note>
+	  <direction placement="below">
+        <direction-type>
+          <pedal default-y="-95" line="no" type="stop"/>
+        </direction-type>
+        <offset sound="yes">32</offset>
+        <staff>2</staff>
+        <sound damper-pedal="no"/>
+      </direction>
+      <note default-x="173.56" default-y="-25.00">
+        <pitch>
+          <step>A</step>
+          <octave>4</octave>
+          </pitch>
+        <duration>1</duration>
+        <voice>1</voice>
+        <type>quarter</type>
+        <stem>up</stem>
+        </note>
+      <direction placement="below">
+        <direction-type>
+          <pedal type="start" line="yes" default-y="-71.35"/>
+          </direction-type>
+        </direction>
+      <note default-x="266.40" default-y="-20.00">
+        <pitch>
+          <step>B</step>
+          <octave>4</octave>
+          </pitch>
+        <duration>1</duration>
+        <voice>1</voice>
+        <type>quarter</type>
+        <stem>down</stem>
+        </note>
+      <note default-x="359.24" default-y="-15.00">
+        <pitch>
+          <step>C</step>
+          <octave>5</octave>
+          </pitch>
+        <duration>1</duration>
+        <voice>1</voice>
+        <type>quarter</type>
+        <stem>down</stem>
+        </note>
+      <direction placement="below">
+        <direction-type>
+          <pedal type="stop" line="yes"/>
+          </direction-type>
+        </direction>
+      <barline location="right">
+        <bar-style>light-heavy</bar-style>
+        </barline>
+      </measure>
+    </part>
+  </score-partwise>